Дочерний процесс в вычислительной технике — это процесс, созданный другим процессом ( родительским процессом ). Этот метод относится к многозадачным операционным системам и иногда называется подпроцессом или традиционно подзадачей .
Существует две основные процедуры создания дочернего процесса: системный вызов fork (предпочтительный в Unix-подобных системах и стандарте POSIX ) и spawn (предпочтительный в современном (NT) ядре Microsoft Windows , а также в некоторых исторических операционных системах).
Дочерние процессы датируются концом 1960-х годов, с ранней формой в более поздних ревизиях формы Multiprogramming with a Fixed number of Tasks Version II (MFT-II) операционной системы IBM OS/360 , которая ввела подзадачность (см. задачу ). Текущая форма в Unix опирается на Multics (1969), в то время как форма Windows NT опирается на OpenVMS (1978) из RSX-11 (1972).
Дочерний процесс наследует большинство своих атрибутов , таких как файловые дескрипторы , от своего родителя. В Unix дочерний процесс обычно создается как копия родителя с помощью системного вызова fork . Затем дочерний процесс может накладываться на себя с другой программой (используя exec ) по мере необходимости. [1]
Каждый процесс может создавать множество дочерних процессов, но будет иметь максимум один родительский процесс; если у процесса нет родителя, это обычно указывает на то, что он был создан непосредственно ядром . В некоторых системах, включая системы на базе Linux , самый первый процесс (называемый init ) запускается ядром во время загрузки и никогда не завершается (см. Процесс запуска Linux ); другие процессы без родителей могут быть запущены для выполнения различных задач демона в пространстве пользователя . Другой способ для процесса остаться без родителя — это если его родитель умирает, оставляя процесс-сироту ; но в этом случае он вскоре будет принят init .
Сигнал SIGCHLD отправляется родителю дочернего процесса, когда он завершается , прерывается или возобновляется после прерывания. По умолчанию сигнал просто игнорируется. [2]
Когда дочерний процесс завершается, некоторая информация возвращается родительскому процессу.
Когда дочерний процесс завершается до того, как родительский процесс вызвал wait , ядро сохраняет некоторую информацию о процессе, например, его статус выхода , чтобы родительский процесс мог вызвать wait позже. [3] Поскольку дочерний процесс все еще потребляет системные ресурсы, но не выполняется, его называют зомби-процессом . Системный вызов wait обычно вызывается в обработчике SIGCHLD.
POSIX.1-2001 позволяет родительскому процессу выбирать для ядра автоматическое извлечение дочерних процессов, которые завершаются явной установкой расположения SIGCHLD на SIG_IGN (хотя игнорировать является значением по умолчанию, автоматическое извлечение происходит только если расположение установлено на игнорировать явно [4] ), или установкой флага SA_NOCLDWAIT для сигнала SIGCHLD. Ядра Linux 2.6 придерживаются этого поведения, и FreeBSD поддерживает оба этих метода с версии 5.0. [5] Однако из-за исторических различий между поведением System V и BSD в отношении игнорирования SIGCHLD вызов wait остается наиболее переносимой парадигмой для очистки после ответвления дочерних процессов. [6]