Введение
Детский процесс в вычислительной технике — это процесс, созданный другим процессом (родительским процессом). Эта техника используется в многозадачных операционных системах и иногда называется подпроцессом или, традиционно, подзадачей. Существуют два основных способа создания дочернего процесса: системный вызов fork (предпочтительный в Unix-подобных системах и стандарте POSIX) и spawn (предпочтительный в современном (NT) ядре Microsoft Windows, а также в некоторых исторических операционных системах).
A child process in computing is a process created by another process (the parent process). This technique pertains to multitasking operating systems, and is sometimes called a subprocess or traditionally a subtask. There are two major procedures for creating a child process: the fork system call (preferred in Unix like systems and the POSIX standard) and the spawn (preferred in the modern (NT) kernel of Microsoft Windows, as well as in some historical operating systems).
История
Детские процессы появились в конце 1960-х годов, с ранней реализацией в более поздних редакциях операционной системы IBM OS/360, использующей многопрограммирование с фиксированным числом задач версии II (MFT II), которая впервые внедрила подзадачи (см. задачу). Современная реализация в Unix восходит к Multics (1969), а реализация в Windows NT – к OpenVMS (1978) и RSX-11 (1972).
Дети, созданные вилкой
Детский процесс наследует большинство своих атрибутов, таких как файловые дескрипторы, от родительского процесса. В Unix дочерний процесс обычно создается как копия родительского с помощью системного вызова fork. Дочерний процесс затем может быть заменен другой программой (используя) по мере необходимости. Каждый процесс может создавать множество дочерних процессов, но имеет не более одного родительского процесса; если у процесса нет родителя, это обычно означает, что он был создан непосредственно ядром. В некоторых системах, включая системы на базе Linux, самый первый процесс (называемый init) запускается ядром при загрузке и никогда не завершается (см. процесс запуска Linux); другие процессы без родителя могут быть запущены для выполнения различных задач демона в пользовательском пространстве. Другой способ, которым процесс может остаться без родителя, – это смерть родительского процесса, оставляющая процесс-сироту; однако в этом случае он вскоре будет усыновлен init. Сигнал SIGCHLD отправляется родительскому процессу, когда дочерний процесс завершается, прерывается или возобновляется после прерывания. По умолчанию этот сигнал игнорируется.
Конец жизни
Когда дочерний процесс завершается, некоторая информация возвращается родительскому процессу. Если дочерний процесс завершается до того, как родительский процесс вызовет wait, ядро сохраняет некоторую информацию о нём, такую как статус выхода, чтобы родительский процесс мог вызвать wait позднее. Поскольку дочерний процесс продолжает потреблять системные ресурсы, но не выполняется, он называется процессом-зомби. Системный вызов wait обычно вызывается в обработчике сигнала SIGCHLD. POSIX.1 2001 позволяет родительскому процессу настроить ядро на автоматическую "уборку" завершенных дочерних процессов, явно установив обработку сигнала SIGCHLD в SIG_IGN (хотя игнорирование является значением по умолчанию, автоматическая уборка происходит только при явной установке обработки в игнорирование), или установив флаг SA_NOCLDWAIT для сигнала SIGCHLD. Ядра Linux 2.6 соответствуют этому поведению, а FreeBSD поддерживает оба этих метода, начиная с версии 5.0. Однако, из-за исторических различий в поведении System V и BSD в отношении игнорирования SIGCHLD, вызов wait остаётся наиболее переносимым способом очистки ресурсов после завершения дочерних процессов, созданных с помощью fork.