Зомби на самом деле не имеет отношения к другим; это просто процесс, который завершился, но его родительский процесс еще не прочитал свой статус завершения с waitpid()
или подобный. Вы не должны видеть их, если процесс не глючит или не останавливается.
Демон это программа , которая работает без управляющего терминала. Обычно, когда вы запускаете программу, она fork()s
сама и родитель покидают ее, поэтому оболочка думает, что команда завершилась, и дочерний процесс отсоединяется от терминала и выходит из сеанса входа в систему. Поскольку родительский процесс завершен, его идентификатор родительского процесса становится равным 1, что традиционно является init
программой или в наши дни systemd
. Этот процесс гарантирует, что его дети пожнут, когда они умрут, чтобы вы не заполнились зомби.
Процесс может быть связан с управляющим терминалом , откуда он обычно получает свой вход и отправляет свой выход. Терминал также может отправлять сигналы процессам, прикрепленным к нему, и идентифицирует группу процессов как группу переднего плана . Процессам, входящим в группу переднего плана , разрешено считывать ввод с терминала, и отправляются сигналы SIGINT и SIGSUSP при нажатии клавиш Ctrl-C и Ctrl-Z. Любой процесс, не входящий в группу переднего плана, который пытается прочитать с терминала, приостанавливается с помощью SIGTSTP.
Оболочка создает различные группы процессов для каждой команды конвейера, которую вы просите ее выполнить, и смещает, какая из них является группой переднего плана для перемещения заданий между передним планом и фоном. Когда вы запускаете команду, обычно оболочка создает новую группу процессов и делает эту группу приоритетной . Если вы добавляете суффикс к нему, &
то оболочка просто покидает группу переднего плана, где она была, и поэтому новая группа находится в фоновом режиме. Нажатие Ctrl-Z отправляет SIGSUSP в группу переднего плана, что приводит к приостановке большинства команд, но вместо приостановки оболочка заменяет активную группу переднего плана на себя, чтобы она могла запросить у вас новую команду.
Команда bg
отправляет SIGCONT группе процессов, чтобы он мог продолжить работу в фоновом режиме после того, как был приостановлен с помощью SIGSUSP. fg
изменяет группу переднего плана на одну из существующих групп, уже работающих в фоновом режиме, переводя ее на передний план.
fork()
отключить свою копию, использоватьexec()
в этой копии заменить его тем, что вы хотите запустить, и использоватьwait()
в исходном экземпляре программы (а не в той копии, которая была запущенаexec()
). За очень короткий промежуток времени междуwait()
выходом ребенка и получением статуса выхода (удаление его из таблицы процессов и возвращение вызывающей стороне) у вас появляется зомби.