EMZETT.
Войти

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, и он должен подбирать осиротевших потомков.

См. также: процессы и сигналы