Для простого конвейера с двумя командами может оказаться достаточным предложенный вами интерфейс функций.Для общего случая N-ступенчатого конвейера, я не думаю, что он достаточно гибок.
Системный вызов pipe()
используется для создания канала.В контексте, вы будете создавать одну трубу перед разветвлением.Один из двух процессов организует, чтобы конец записи канала стал его стандартным выводом (вероятно, с использованием dup2()
), а затем закроет оба файловых дескриптора, первоначально возвращенных pipe()
.Затем он выполнит команду, которая пишет в канал (cat textfile
в вашем примере).Другой процесс организует, чтобы код чтения канала стал его стандартным вводом (возможно, снова используя dup2()
), а затем закроет оба дескриптора файла, первоначально возвращенного pipe()
.Затем он выполнит команду, которая читает из канала (more
в вашем примере).
Конечно, еще будет третий процесс - процесс родительской оболочки - который разветвил дочерний элемент для запускавесь трубопровод.Вы можете решить, что хотите немного усовершенствовать механизмы, если хотите отслеживать статусы каждого процесса в конвейере;тогда процесс организации немного отличается.