Да, оболочка должна fork выполнять каждый подпроцесс. Помните, что когда вы вызываете одно из семейств функций execve()
, он заменяет текущий образ процесса с помощью exec'ed. Ваша оболочка не может продолжать обрабатывать дальнейшие команды, если она непосредственно выполняет подпроцесс, потому что после этого она больше не существует (кроме как подпроцесс).
Чтобы исправить это, просто fork()
снова в ветви pid == 0
, и выполните команду ls
в этом дочернем элементе. Помните wait()
для обоих (всех) дочерних процессов, если вы не хотите, чтобы конвейер выполнялся асинхронно.
Да, вам нужно вызывать fork по крайней мере дважды, один раз для каждой программы в конвейере. Помните, что exec заменяет образ программы текущего процесса, поэтому ваша оболочка перестает существовать с момента запуска сортировки или (tr).