在 GNU OS 中,如果另一个进程同时(从同一管道)读取相同的数据,则一个进程只能将数据写入管道。
是否有类似管道的东西可以让第一个进程写入并缓冲数据,直到第二个进程读取它?
答案1
命名管道(fifo)在某种程度上可以做你想做的事情,但有一些注意事项:
如果您希望能够在读取器存在之前写入管道,则写入器必须以读写方式打开 fifo,否则对的调用
open
将被阻止。在 shell 中,这可能看起来像这样:exec 3<>/path/to/pipe echo "foo" >&3 cat <&3
正如您所看到的,我可以在读者出现之前向管道写入数据。一旦我从管道中读取数据,我写的消息就已经在那里了。
一旦管道填满,对管道的写入最终将被阻塞。根据管道(7)在Linux上:
管道的容量是有限的。如果管道已满,则 write(2) 将阻塞或失败,具体取决于是否设置了 O_NONBLOCK 标志(见下文)。不同的实现对管道容量有不同的限制。应用程序不应依赖于特定的容量:应用程序的设计应使读取过程在数据可用时立即使用数据,以便写入过程不会保持阻塞状态。
在2.6.11之前的Linux版本中,管道的容量与系统页面大小相同(例如,i386上为4096字节)。从Linux 2.6.11开始,管道容量为65536字节。
根据您的用例,您还可以考虑使用消息队列。内核提供了一个消息队列。在 Linux 上,请参阅mq_概述(7)以获得良好的概览。或者,RabbitMQ 等服务提供具有各种功能集的消息队列,包括可跨网络使用。
答案2
这个问题现在已经很老了 - 但是缓冲命令提供了在管道中缓冲数据的能力。
答案3
你的意思是http://en.wikipedia.org/wiki/Named_pipe?它按照你的要求工作。