В некоторых ответах используется слово «поджатник». Поиск в Google также приводит к появлению записей, где слово «только что использовалось».
Как я могу понять, что такое «поджатник»?
В некоторых ответах используется слово «поджатник». Поиск в Google также приводит к появлению записей, где слово «только что использовалось».
Как я могу понять, что такое «поджатник»?
Ответы:
Это было реализовано в ядре Linux 3.4 как флаг системного вызова prctl () .
Из prctl(2)
справочной страницы:
[...] Поджаток выполняет роль
init(1)
своих потомков. После завершения процесса, который осиротел (т. Е. Его непосредственный родитель уже завершен) и помечен как имеющий подпочерника, ближайший еще живущий подпочерник получитSIGCHLD
сигнал и сможетwait(2)
в процессе обнаружить свой статус завершения.
Процесс может определить себя как подчиненный с prctl(PR_SET_CHILD_SUBREAPER)
. Если это так, init
родитель (родительский родительский процесс ), который не является (PID 1), станет родителем сирот , а вместо него ближайший родительский родитель , помеченный как подчиненный, станет новым. Если нет живого прародителя, init
значит.
Причиной реализации этого механизма было то, что руководители / супервизоры сервисов пользовательского пространства (например upstart
, systemd
) должны отслеживать свои запущенные сервисы. Многие сервисы демонизируются с помощью двойного разветвления и неявно переизбираются на PID 1. Менеджер сервисов больше не сможет получать SIGCHLD
сигналы для них и больше не отвечает за пожинание детей wait()
. Вся информация о детях теряется в тот момент, когда PID 1 очищает заново родившиеся процессы. Теперь процесс диспетчера служб может помечать себя как своего рода «sub-init» и теперь может оставаться родительским для всех потерянных процессов, созданных запущенными службами. Все SIGCHLD
сигналы будут доставлены сервис-менеджеру.
В Linux, как правило, создается демон, который дважды разветвляется, когда промежуточный процесс завершает работу после разветвления внука. Это обычная техника, позволяющая избежать зомби-процессов . Скрипт инициализации вызывает ребенка. Этот ребенок снова разветвляется и, таким образом, немедленно выходит. Внук будет усыновлен init
, который постоянно призывает wait()
собирать статусы выхода своих детей, чтобы избежать зомби. С концепцией подзадач менеджер службы пользовательского пространства теперь становится новым родителем, а не init
.