fork и exec: как Unix запускает программы
Коротко: Unix запускает новые программы в два шага: fork копирует работающий процесс, exec заменяет в копии программу на другую.
Подробнее: Так же запускается и каждая команда в оболочке. Такое разделение позволяет между двумя шагами выполнить настройки вроде перенаправлений или прав.
Подробности
- fork: Создаёт дочерний процесс с почти идентичным состоянием. Отличить их позволяет возвращаемое значение: в родителе PID потомка, в потомке 0. Благодаря Copy-on-Write это дёшево.
- exec: Загружает в процесс новую программу. PID остаётся, память и код заменяются.
- wait: Родитель ждёт завершения потомка через
wait/waitpid. Если он забудет, останется процесс-зомби. - Перенаправление: После
forkи передexecоболочка открывает файлы (>) или каналы и назначает их вводом и выводом. - Windows: Не знает fork, а имеет
CreateProcess, объединяющий оба шага. - Современные альтернативы:
posix_spawnиvforkэкономят затраты для больших процессов. - Контейнеры: Первый процесс в контейнере — PID 1, и он должен подбирать осиротевших потомков.
См. также: процессы и сигналы