在posix中有多个进程写入命名管道上的单个阅读器会有影响吗?

时间:2009-02-25 20:34:30

标签: ipc posix named-pipes fifo

我正在为POSIX(OSX)编写一个程序,我将有许多进程向一个侦听器发送消息,该侦听器本质上是一个日志记录线程。所有进程都在单独的程序中运行,并且使用许多进程写入的单个命名管道(FIFO),但只有一个进程读取是非常诱人的。

的问题:

1)这会有效吗? - 我可以使用bash来设置一个包含多个进程写入的fifo,所以我在理论上知道这是有效的。但在实践中,是否存在我正在掩饰的问题?

shell#1

$ mkfifo /tmp/fifo
$ cat /tmp/fifo
shell#2和#3

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

2)如果每个编写器只写相对较短的消息(< 100字节?),那么我可以假设每次调用write()都将被发送给读者吗?或者,一条消息的一半会有来自另一位作者的另一半消息的乱码风险?

感谢任何建议。

1 个答案:

答案 0 :(得分:11)

FIFO写入应该是原子的,只要它在页面大小之下。因此,100字节消息不应该存在问题。在Linux上,最大尺寸曾经是4K,我相信它现在更大了。我在一些系统上使用这种技术进行消息传递,因为写入最终是原子的。

如果使用一系列写操作,最终可能会遇到问题,因为输出缓冲可能会导致同步问题。因此,请确保一次写入整个消息。例如。构建一个字符串,然后打印,不要一次打印多个部分。

s="This is a message"
echo $s

不是

echo "This "
echo "is "
echo " a message"