2009-02-25 15 views
8

Tôi đang viết một chương trình cho POSIX (OSX), nơi tôi sẽ có nhiều quy trình gửi tin nhắn đến một người nghe, chủ yếu là một chuỗi ghi nhật ký. Tất cả các tiến trình đang chạy trong các chương trình riêng biệt, và sử dụng một ống có tên duy nhất (FIFO) mà nhiều tiến trình ghi vào, nhưng chỉ một tiến trình đọc duy nhất là rất hấp dẫn.Có ảnh hưởng nào đến việc có nhiều quy trình ghi vào một đầu đọc đơn trên một ống có tên trong posix không?

Câu hỏi:

1) Thao tác này có hoạt động không? - Tôi có thể làm công việc này bằng cách sử dụng bash để thiết lập một FIFO với nhiều quy trình viết cho nó, vì vậy tôi biết về lý thuyết công trình này. Nhưng trong thực tế, có vấn đề gì tôi đang che đậy?

vỏ # 1

$ mkfifo /tmp/fifo 
$ cat /tmp/fifo 

vỏ # 2 và # 3

$ cat > /tmp/fifo 
"Type stuff here, after hitting enter, it is read by shell #1" 

2) Nếu mỗi nhà văn chỉ viết thông điệp tương đối ngắn (< 100 byte?) Sau đó tôi có thể giả định rằng mỗi cuộc gọi để viết() sẽ được gửi đến người đọc trong toàn bộ nó? Hoặc sẽ một nửa của một tin nhắn có nguy cơ bị cắt xén với một nửa thông điệp khác từ một nhà văn khác?

cảm ơn lời khuyên nào.

Trả lời

10

Ghi FIFO phải là nguyên tử, miễn là dưới kích thước trang. Vì vậy, không nên có vấn đề với 100 byte tin nhắn. Trên linux kích thước tối đa được sử dụng là 4K, tôi tin rằng nó lớn hơn bây giờ. Tôi đã sử dụng kỹ thuật này trên một vài hệ thống để truyền thông điệp, vì các bài viết kết thúc bằng nguyên tử.

Bạn có thể kết thúc với một vấn đề, nếu bạn đang sử dụng một loạt các ghi, kể từ khi bộ đệm đầu ra có thể gây ra sự cố đồng bộ hóa. Vì vậy, hãy chắc chắn rằng toàn bộ tin nhắn được viết cùng một lúc. ví dụ. xây dựng một chuỗi, sau đó in, không in nhiều phần cùng một lúc.

s="This is a message" 
echo $s 

KHÔNG

echo "This " 
echo "is " 
echo " a message" 
+0

bạn đang chào đón :) – sfossen

Các vấn đề liên quan