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