Основная причина этого соглашения заключается в том, что если процесс разветвляет потомков, обычно дочерние процессы выполняют часть работы что должен был сделать основной процесс. Вы имели в виду какой-нибудь пример программы, которая разветвляется?
Вот несколько примеров:
netcat
иногда иметь один процесс, читающий с хоста А и записывающий на хост Б, и один процесс, читающий с хоста B и записывающий на хост A. (Да, это также можно сделать с помощью потоков.)find -exec
и xargs
, задача (основной )программы заключается в запуске подчиненной программы и дождитесь завершения. Представьте, что произойдет, если пользователь скажет find. -type f -exec cp {} /backup ';' && rm -r.и
find
вышел, не дожидаясь завершения всех копий. В этих (и других )случаях основная работа программы не выполняется. пока все дочерние процессы не будут завершены. Поэтому программа не должна выходить пока он не дождется всех дочерних процессов (es ).
Конечно, это не единственный способ использования fork. Это обычно для сетевых серверов (, например, FTP и почты ). иметь один основной процесс, который прослушивает входящие соединения, а затем разветвлять дочерний элемент каждый раз, когда он подключается к клиенту. Такие дочерние процессы могут завершаться в произвольное время. (определяются клиентами ), и у основного процесса нет причин ждать своих потомков.
Немного о том, что такое «родительский» процесс/жнец дочерний процесс связан с завершением на самом деле не проблема.