8

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

问题:

1)这会工作吗?- 我可以使用 bash 设置一个具有多个写入它的进程的 fifo 来完成这项工作,所以我知道理论上这是可行的。但在实践中,有没有我在掩饰的问题?

外壳 #1

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

贝壳 #2 和 #3

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

2)如果每个作者只写相对较短的消息(< 100 字节?),那么我可以假设每个对 write() 的调用都会完整地发送给读者吗?或者,一条消息的一半是否会与来自不同作者的另一条消息的一半存在混淆?

感谢您的任何建议。

4

1 回答 1

12

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

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

s="This is a message"
echo $s

不是

echo "This "
echo "is "
echo " a message"
于 2009-02-25T20:43:28.827 回答