Труба - связь с несколькими разветвленными дочерними процессами - PullRequest
1 голос
/ 03 июня 2019

Я пишу родительский процесс, который должен считать события из группы дочерних процессов.Я собираюсь использовать pipe () для достижения этой цели.

Могу ли я открыть один канал на родительском, а затем разветвить 4 дочерних процесса, которые будут использовать этот же канал для связи с родителем, или я должен создать4 разные трубы?(1 для каждого дочернего процесса)

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

Кроме того: В случае, если я могу использовать общий канал, какой будет атомарность сообщений.Должен ли я хранить их по одному байту или я могу предположить, что два 4-байтовых сообщения не получат интерполяцию своих байтов?

Ответы [ 3 ]

4 голосов
/ 03 июня 2019

Вы можете использовать одну трубу.

Вам не нужно ограничивать себя однобайтовыми событиями.

man 7 pipe в состояниях Linux:

PIPE_BUF

POSIX.1 говорит, что write (2) s меньше чем PIPE_BUF байтов должно быть атомарный: выходные данные записываются в канал как непрерывный последовательность. Запись более чем PIPE_BUF байтов может быть неатомной: Ядро может чередовать данные с данными, записанными другими процессами. POSIX.1 требует, чтобы PIPE_BUF был не менее 512 байтов. (В Linux PIPE_BUF - 4096 байт.)

(Связанный: описание write в POSIX .)

0 голосов
/ 03 июня 2019

Другим вариантом является использование одной пары сокетов дейтаграммы Unix, созданной с socketpair вместо канала.В этом случае каждый write создает отдельную дейтаграмму, а каждый read возвращает только одну дейтаграмму.Таким образом, сообщения могут быть больше чем PIPE_BUF и все еще быть атомарными.

0 голосов
/ 03 июня 2019

Попробуйте использовать именованный канал в этом примере https://www.geeksforgeeks.org/named-pipe-fifo-example-c-program/ Выполните промывку считывателя, и тогда написанное должно выполнить работу, вам также следует подумать об очереди сообщений, которая является асинхронным способом связи между процессом

...