单个管道是否可以被多个进程连接和读取

Can single pipe be connected and read by multiple processes

根据我的理解,C 管道就像一种特殊的文件,在内部,内核在 table 中跟踪每个进程的打开和关闭。 see the post here

所以从这个意义上说:

  1. 1个管道是否可以被多个进程连接?
  2. 如果可以的话,多个进程读取同一份数据可以吗?
  3. 如果 2 是可能的,他们会读取相同的数据,还是读取数据“清空”数据?

例如:进程1写入pipe,进程2,3,4能否读取进程1写入的数据?

是的,多个进程可以读取(或写入)一个管道。

但是 进程的数据不会重复。一个进程从管道中读取数据后,数据就会丢失,并且仅供实际读取它的进程使用。

相反,如果您有多个进程写入单个管道,则无法区分数据或数据来自哪个进程。

1. Is it possible for 1 single pipe to be connected by multiple processes?

是的。

2. If it is possible, can multiple processes read the same data?

没有!

Unix fifos(管道)不能以“单生产者,多消费者” (spmc) 方式使用;这也适用于 Unix Domain Sockets(对于大多数实现,UDS 和 fifos 由完全相同的代码实现,只有少数配置位在创建时有所不同)。写入管道/SOCK_STREAM UDS(或写入SOCK_DGRAM unix 域套接字的数据报)的每个字节只能从一个读取端读取。

然而,完全可能的是 “多生产者,单一消费者”fifo,UDS,即消费者打开一个读取端(同时保持打开写入端,但不使用它¹),多个生产者可以向单个消费者发送数据。对于面向流的管道,没有严格的顺序,因此所有发送的字节都会混淆。但是对于 SOCK_DGRAM UDS socketpairs 消息边界被保留。

¹:有一个特别的陷阱,如果创建进程不保持打开其写入端实例,一旦任何一个生产者进程关闭其写入端之一,它将断开连接对于所有其他进程。