Подождите (системный вызов) - Wait (system call)
Эта статья не цитировать любой источники.Март 2007 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В компьютер операционные системы, а процесс (или же задача ) май ждать в другом процессе, чтобы завершить его выполнение. В большинстве систем родительский процесс может создать самостоятельно исполняющийся дочерний процесс. Затем родительский процесс может выдать ждать системный вызов, который приостанавливает выполнение родительского процесса на время выполнения дочернего. Когда дочерний процесс завершается, он возвращает статус выхода в операционную систему, которая затем возвращается ожидающему родительскому процессу. Затем родительский процесс возобновляет выполнение.
Современные операционные системы также предоставляют системные вызовы, которые позволяют процессу нить для создания других потоков и ожидания их завершения ("присоединиться "их) аналогичным образом.
Операционная система может предоставлять варианты ждать вызов, который позволяет процессу ждать, пока любой из его дочерних процессов выход, или дождаться одного конкретного дочернего процесса (идентифицируемого его идентификатор процесса ) выходить.
Некоторые операционные системы выдают сигнал (SIGCHLD ) в родительский процесс, когда дочерний процесс завершается, уведомляя родительский процесс и позволяя ему получить статус выхода дочернего процесса.
В статус выхода возвращаемый дочерним процессом обычно указывает, завершился ли процесс нормально или ненормально. Для нормального завершения этот статус также включает код выхода (обычно целочисленное значение), который процесс возвратил системе. В течение первых 20 лет существования UNIX только 8 младших битов кода выхода были доступны для ожидающего родителя. В 1989 г. SVR4,[нужна цитата ] новый звонок waitid был введен, который возвращает все биты из выход вызов в структуре под названием siginfo_t в составе структуры si_status.[нужна цитата ] Waitid является обязательной частью стандарта POSIX с 2001 года.
Зомби и сироты
Когда дочерний процесс завершается, он становится зомби процесс, и продолжает существовать как запись в системе таблица процессов даже если это больше не активно выполняющаяся программа. При нормальной работе его обычно немедленно ожидает родитель, а затем забирает система, возвращая ресурс (запись в таблице процессов). Если дочерний элемент не ждет своего родителя, он продолжает потреблять этот ресурс бесконечно, и, таким образом, является утечка ресурсов. Такие ситуации обычно решаются с помощью специального "жатокопробного" процесса.[нужна цитата ] который обнаруживает зомби и извлекает их статус выхода, позволяя операционной системе освободить их ресурсы.
И наоборот, дочерний процесс, родительский процесс которого завершается до того, как это произойдет, становится сиротский процесс. Такие ситуации обычно обрабатываются с помощью специального «корневого» (или «init») процесса, который назначается как новый родительский процесс, когда его родительский процесс завершается. Этот специальный процесс обнаруживает, когда сиротский процесс завершается, и затем извлекает его статус выхода, позволяя системе освободить завершенный дочерний процесс.
Если дочерний процесс получает сигнал, ожидающий родительский процесс продолжит выполнение, оставив позади процесс-сирот.[нужна цитата ] Следовательно, иногда необходимо проверить аргумент, установленный с помощью wait, waitpid или waitid, и, в случае, если WIFSIGNALED имеет значение true, дождаться, пока дочерний процесс снова освободит ресурсы.[нужна цитата ]