Насколько я понимаю, каналы C похожи на особый вид файла, в котором ядро ​​отслеживает открытия и закрытия каждого процесса в таблице. см. сообщение здесь

Итак, в этом смысле:

  1. Возможно ли, чтобы одна труба была соединена несколькими процессами?
  2. Если возможно, могут ли несколько процессов читать одни и те же данные?
  3. Если возможно 2, будут ли они читать одни и те же данные, или чтение данных «опустошает» данные?

Например: процесс 1 записывает в канал, может ли процесс 2,3,4 читать данные, которые записал процесс 1?

2
neowenshun 25 Сен 2021 в 13:22

2 ответа

Лучший ответ

Да, несколько процессов могут читать (или записывать) канал.

Но данные для процессов не дублируются. После того, как данные были прочитаны из конвейера одним процессом, они теряются и доступны только процессу, который их действительно читал.

И наоборот, нет способа отличить данные или от того, из какого процесса они возникли, если у вас есть несколько процессов, записывающих в один канал.

4
Some programmer dude 25 Сен 2021 в 10:30

1. Возможно ли соединение одной трубы несколькими процессами?

Да.

2. Если возможно, могут ли несколько процессов читать одни и те же данные?

Нет!

FIFO (каналы) Unix не могут использоваться в режиме «один производитель, несколько потребителей» (spmc); это также справедливо для сокетов домена Unix (для большинства реализаций UDS и FIFO реализуются одним и тем же кодом, с разницей лишь в нескольких битах конфигурации при создании). Каждый байт, записанный в канал / SOCK_STREAM UDS (или дейтаграмму, записанную в сокет домена unix SOCK_DGRAM), может быть прочитан только с одного конца чтения.

Однако вполне возможно иметь "несколько производителей, один потребитель " fifo, UDS, то есть потребитель, открывающий один конец чтения (и также оставляющий открытым конец записи, но не использующий его¹), несколько производители могут отправлять данные одному потребителю. Для потоково-ориентированных каналов нет строгого порядка, поэтому все отправленные байты будут перепутаны. Но для SOCK_DGRAM UDS границы сообщений пар сокетов сохраняются.

¹: Существует особая ловушка, заключающаяся в том, что если процесс создания не сохраняет открытым свой экземпляр конца записи, как только какой-либо из процессов-производителей закрывает один из своих концов записи, он разрывает соединение для всех других процессов.

1
datenwolf 25 Сен 2021 в 10:37