Почему необходимо использовать fork?
Когда вы запускаете конвейер из оболочки, например,
$ ls | more
что происходит?Оболочка запускает два процесса (один для ls
, один для more
).Кроме того, выход (STDOUT) ls
соединен с входом (STDIN) more
трубой.
Обратите внимание, что ls
и more
не нужно ничего знатьо каналах они просто пишут (и читают) их STDOUT (и STDIN) соответственно.Кроме того, поскольку они могут выполнять обычные блокировки операций чтения и записи, важно, чтобы они могли работать одновременно.В противном случае ls
может просто заполнить буфер канала и навсегда заблокировать, прежде чем more
получит шанс что-либо потребить.
... передает что-то другому ...
Также обратите внимание, что помимо аргумента параллелизма, если ваша что-то еще является другой программой (например, more
), она должна выполняться в другом процессе.Вы создаете этот процесс, используя fork
.Если вы просто запустите more
в текущем процессе (используя exec
), он заменит вашей программы.
В общем, вы может использовать канал без fork
, но вы просто будете общаться в своем собственном процессе.Это означает, что вы либо выполняете неблокирующие операции (возможно, в синхронной совместной подпрограмме), либо используете несколько потоков.