Это предложение не очень понятно. Во-первых, родитель должен быть предком , поскольку процесс, устанавливающий канал, может быть родителем, или прародителем, или пра-пра-пра-прародителем, или одним из взаимодействующих процессов. Во-вторых, предложение не означает «если вы хотите конвейер, должен существовать общий процесс предка», но «если вы хотите конвейер, процесс общего предка должен его настроить».
Под капотом процесс устанавливает трубу с собой. Канал - это файловый дескриптор, как и любой другой, а точнее пара файловых дескрипторов, по одному для каждого конца. Процесс, создавший канал, может немедленно использовать его для отправки данных самому себе, хотя это редко бывает полезно (хотя самотрубка действительно имеет свое применение).
Типичная идиома для процесса - установить канал, затем разветвить дочерний процесс и закрыть один конец канала в родительском, а другой конец канала в дочернем. Это позволяет родительскому и дочернему процессам общаться в одном направлении. Если процессам требуется двунаправленная связь, им нужны два канала (за исключением некоторых вариантов Unix, где каналы являются двунаправленными).
Каналы по очереди наследуются любыми дочерними элементами, поэтому процесс, который создал канал, может не участвовать в обмене данными. Например, канал в оболочке, созданный между двумя внешними командами, такими как, ls | rot13
включает следующие шаги:
- Оболочка создает трубу.
- Оболочка разветвляется на процесс. Ребенок закрывает чтения конца трубы и звонков
execve
на ls
.
- Оболочка разветвляется на процесс. Ребенок закрывает конец записи трубы и звонки
execve
на rot13
.
- Оболочка закрывает оба конца канала и ожидает выхода обоих подпроцессов.
Если два существующих процесса хотят общаться друг с другом, они могут использовать именованный канал . (Ну, есть также передача файлового дескриптора , но это не для слабонервных.)