命名管道(fifo)可以做你想做的事情,但有几个警告:
如果您希望能够在读取器存在之前写入管道,则您的写入器必须以读写方式打开 fifo,否则调用open
将阻塞。在 shell 中,这可能如下所示:
exec 3<>/path/to/pipe
echo "foo" >&3
cat <&3
Run Code Online (Sandbox Code Playgroud)
正如你在那里看到的,我可以在读者出现之前写到管道。一旦我从管道中读取,我写的消息就已经存在了。
一旦管道填满,对管道的写入最终将被阻塞。根据linux 上的pipe(7):
管道的容量有限。如果管道已满,则 write(2) 将阻塞或失败,具体取决于是否设置了 O_NONBLOCK 标志(见下文)。不同的实现对管道容量有不同的限制。应用程序不应依赖于特定的容量:应用程序的设计应使读取进程在数据可用时立即消耗数据,从而使写入进程不会一直阻塞。
在 2.6.11 之前的 Linux 版本中,管道的容量与系统页面大小相同(例如,在 i386 上为 4096 字节)。从 Linux 2.6.11 开始,管道容量为 65536 字节。
根据您的用例,您还可以考虑使用消息队列。内核提供了一个消息队列。在 Linux 上,请参阅mq_overview(7)以获得很好的概述。或者,RabbitMQ 之类的服务为消息队列提供了各种功能集,包括可跨网络使用。