GNU OS 中的缓冲(命名)管道

GNU OS 中的缓冲(命名)管道

在 GNU OS 中,如果另一个进程同时(从同一管道)读取相同的数据,则一个进程只能将数据写入管道。

是否有类似管道的东西可以让第一个进程写入并缓冲数据,直到第二个进程读取它?

答案1

命名管道(fifo)在某种程度上可以做你想做的事情,但有一些注意事项:

  1. 如果您希望能够在读取器存在之前写入管道,则写入器必须以读写方式打开 fifo,否则对的调用open将被阻止。在 shell 中,这可能看起来像这样:

    exec 3<>/path/to/pipe
    echo "foo" >&3
    cat <&3
    

    正如您所看到的,我可以在读者出现之前向管道写入数据。一旦我从管道中读取数据,我写的消息就已经在那里了。

  2. 一旦管道填满,对管道的写入最终将被阻塞。根据管道(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?它按照你的要求工作。

相关内容