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

Al *_*mov 11 linux cache gnu buffer fifo

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

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

Ste*_*n D 8

命名管道(fifo)可以做你想做的事情,但有几个警告:

  1. 如果您希望能够在读取器存在之前写入管道,则您的写入器必须以读写方式打开 fifo,否则调用open将阻塞。在 shell 中,这可能如下所示:

    exec 3<>/path/to/pipe
    echo "foo" >&3
    cat <&3
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 一旦管道填满,对管道的写入最终将被阻塞。根据linux 上的pipe(7)

管道的容量有限。如果管道已满,则 write(2) 将阻塞或失败,具体取决于是否设置了 O_NONBLOCK 标志(见下文)。不同的实现对管道容量有不同的限制。应用程序不应依赖于特定的容量:应用程序的设计应使读取进程在数据可用时立即消耗数据,从而使写入进程不会一直阻塞。

在 2.6.11 之前的 Linux 版本中,管道的容量与系统页面大小相同(例如,在 i386 上为 4096 字节)。从 Linux 2.6.11 开始,管道容量为 65536 字节。

根据您的用例,您还可以考虑使用消息队列。内核提供了一个消息队列。在 Linux 上,请参阅mq_overview(7)以获得很好的概述。或者,RabbitMQ 之类的服务为消息队列提供了各种功能集,包括可跨网络使用。


sym*_*ean 1

这个问题现在已经相当老了 - 但buffer命令提供了在管道中缓冲数据的能力。