В вашем случае фактически выполняется два fork
вызова: один для команды cat
и один для команды grep
.
Требуются fork
вызовы, потому что единственный стандартный способ выполнения программ в POSIX - это использование семейства вызовов exec
, и эти заменяют образ текущего процесса изображением из загруженного программа. И если оболочка не fork
создает новый процесс для каждой выполняемой команды, первый запуск программы заменит оболочку, и оболочка больше не будет существовать.
Канал настроен так, что конец записи канала будет подключен к стандартному выходу первого дочернего процесса (команда cat
), а конец чтения канала будет подключен к стандартному входу. второго дочернего процесса (команда grep
).
Все это происходит за кулисами в оболочке.