stringtranslate.com

Дочерний процесс

Дочерний процесс в вычислительной технике — это процесс, созданный другим процессом ( родительским процессом ). Этот метод относится к многозадачным операционным системам и иногда называется подпроцессом или традиционно подзадачей .

Существует две основные процедуры создания дочернего процесса: системный вызов 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]

Дети, созданные spawn

Конец жизни

Когда дочерний процесс завершается, некоторая информация возвращается родительскому процессу.

Когда дочерний процесс завершается до того, как родительский процесс вызвал 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]

Смотрите также

Ссылки

  1. ^ Статья основана на материале, взятом из Child+process в Free On-line Dictionary of Computing до 1 ноября 2008 года и включенном в соответствии с условиями «перелицензирования» GFDL версии 1.3 или более поздней.
  2. ^ signal.h  – Справочник базовых определений, Единая спецификация UNIX , версия 4 от The Open Group
  3. ^ wait(2) : ожидание изменения состояния процесса –  Руководство программиста Linux – Системные вызовы
  4. ^ "Ядро Linux: Сигналы". Win.tue.nl . Получено 2014-04-30 .
  5. ^ [1] Архивировано 29 сентября 2011 г. на Wayback Machine.
  6. ^ sigaction(2) : проверка и изменение действия сигнала –  Руководство программиста Linux – Системные вызовы

Внешние ссылки