如何复用命名管道/fifo

问题描述 投票:0回答:2

假设我们有一个命名管道:

mkfifo my_named_pipe

假设有多个写入者写入此命名管道:

node x.js > ${my_named_pipe} &
node y.js > ${my_named_pipe} &
node z.js > ${my_named_pipe} &

类似的事情 - 是否有一种可靠的方法来多路复用它,以便每次都通过一个完整的消息,或者命名管道可以仅从一个写入器可靠读取?

这让我想知道我们如何复用端口/套接字等,我不知道它是如何完成的。

named-pipes multiplexing
2个回答
2
投票

这可能是一个有点幼稚的答案,但这对我有用。

如果单个 FIFO 有多个写入器,并且您不希望它们的输出被破坏,那么您可以使用

stdbuf
,但前提是输出是基于行的。整个段落仍将交错。

stdbuf -oL node x.js > ${my_named_pipe} &
stdbuf -oL node y.js > ${my_named_pipe} &
stdbuf -oL node z.js > ${my_named_pipe} &

man stdbuf
:
stdbuf
- 运行 COMMAND,并修改其标准流的缓冲操作。

这仅在您的原始程序不调整其标准输出流的缓冲时才有效。


0
投票

我使用 ChatGPT 并得到了这个答案(我对 ChatGPT 的原始问题在评论中):


Unix套接字和命名管道(也称为FIFO)都是类Unix操作系统中的进程间通信机制,但它们的用途略有不同,并且在复用方面也有一些差异。

Unix 套接字:

  1. Unix套接字是全双工通信通道,与网络套接字结合使用时,可以用于同一台机器上甚至不同机器上的进程之间的双向通信。
  2. Unix 套接字可以使用各种技术进行多路复用,例如 select()、poll()、epoll(),或者使用多线程或多处理。这意味着多个进程或线程可以同时读取和写入 Unix 套接字,使其适合并发通信。

命名管道 (FIFO):

    另一方面,命名管道通常是单向通信通道。它们允许数据沿一个方向流动,从写入进程到读取进程。一个进程写入管道,另一个进程从中读取。
  1. 命名管道本身并不像 Unix 套接字那样支持多路复用。每个命名管道都有一个写入器和一个读取器,通常是先到先服务的模型。如果您想复用命名管道,则需要创建多个管道并在应用程序中单独管理它们。
总而言之,Unix 套接字可以多路复用,允许多个进程或线程通过单个套接字同时进行通信。默认情况下,命名管道 (FIFO) 不支持多路复用,因为它们是为单向通信而设计的,并且每个命名管道通常用于一名写入者和一名读取者。如果您需要与命名管道进行多路复用,则必须自己管理多个管道。

© www.soinside.com 2019 - 2024. All rights reserved.