单个管道可以连接到多个进程并被多个进程读取吗?

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

根据我的理解,C 管道就像一种特殊的文件,在内部,内核跟踪表中每个进程的打开和关闭。 请看这里的帖子

所以从这个意义上来说:

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

例如:进程1写入管道,进程2、3、4可以读取进程1写入的数据吗?

c linux operating-system kernel
2个回答
6
投票

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

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

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


1
投票

1. 1个单管道可以被多个进程连接吗?

是的。

2.如果可以的话,多个进程可以读取相同的数据吗?

不!

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

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

1:有一个特殊的陷阱,如果创建进程没有保持其写入端实例的打开状态,一旦任何一个生产者进程关闭其写入端之一,它将断开所有其他进程的连接.

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