Безымянные трубы в цепочке процессов - C - PullRequest
1 голос
/ 04 апреля 2020

Мне было интересно, возможно ли порождать цепочку процессов (P0-вилки P1, P1-вилки P2, P2-вилки P3 и т. Д.), Где у каждого (большого) дочернего процесса есть свой отдельный, безымянный канал, соединяющий его к началу цепочки, а именно P0?

Предположим, что P0 действует как своего рода «менеджер» и отправляет инструкции этим процессам. Один может быть добавлен в конце цепочки или конкретный процесс должен быть удален. Сначала я подумал о реализации канала каналов, который соединяет P1-P2-P3 -...- PN, чтобы сообщение распространялось по цепочке до предполагаемого. Но прохождение каждого процесса не будет столь же эффективным, как прямая отправка P0, например, инструкции «FORK» в n -й процесс.

                         ------------
                        | Process P0 |
                         ------------
         1) P0 forks P1 /       
and they share "pipe1" /        3) Here I need individual pipes P0-P2, P0-P3
                      /            until P0-PN
                     /
          ------------           ------------            ---            ------------
         | Process P1 |->forks->| Process P2 |->forks-> |...|->forks-> | Process PN |
          ------------           ------------            ---            ------------
                     2)P1 forks P2

Более того, я Я не уверен, как вилка и трубы будут работать вместе в этом случае. Поскольку ребенок «наследует» файловые дескрипторы своего отца, мне было интересно, будет ли n -й ребенок иметь доступ к файловым дескрипторам всех процессов n-1 , которые предшествуют ему в цепочке и поэтому, возможно, читал на этих трубах тоже.

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

...