Exec без вилки
Есть по крайней мере две причины, почему вы хотели бы сделать такую вещь:
- Цепная загрузка. Текущий образ процесса заменяется чем-то другим.
- Перезапуск работающей в данный момент программы (например, может произойти, когда вы SIGHUP или такой процесс на сервере, перезагрузите все и сделаете новый старт). В некотором смысле, можно утверждать, что это цепная загрузка, только по совпадению с той же самой программой.
вилка без exec
Это то, что делает каждый демон каждый раз, когда он запускается (действительно, дважды). Это делает несколько вещей, в том числе оболочка не зависает (поскольку исходный процесс, на котором она находится, завершается), и демон больше не контролируется терминалом, поэтому закрытие окна оболочки не убивает демона.
Другое распространенное использование - это разветвление детей-работников, которое стало известным благодаря веб-серверу apache около 25 лет назад (в настоящее время это больше не считается современным из-за того, что оно очень склонно к проблеме стада грома, но оно, безусловно, обеспечивает чертовски простой, самый надежный сервер из всех возможных).
Еще одно распространенное использование - создание последовательного снимка. fork
не только создает процесс, но и копирует (теоретически, на самом деле он только помечает страницы, копируемые при записи) адресное пространство. Это (атомарно) создает снимок полных данных программы, которые родительский объект больше не может изменять.
Некоторые программы используют это преимущество. Например, Redis сохраняет данные на диск (в согласованном состоянии), одновременно изменяя набор данных одновременно. Это работает только потому, что fork
создан непротиворечивый снимок, который не видит изменений, внесенных родительским процессом.