В настоящее время я пишу оболочку. Я выполняю процессы и использую обработчик сигнала SIGCHLD
для очистки (ждут на них), когда они будут завершены.
Все работает, за исключением случаев, когда я выполняю процессы, которые повышают привилегии с помощью sudo
. В этих случаях я никогда не получаю сигнал SIGCHLD
, поэтому я никогда не знаю, что процесс завершил выполнение.
Когда я получаю команду, например sudo ls
, я запускаю программу sudo
, а затем предоставляю ls
в качестве параметра. Я выполняю это выполнение с execvp
.
Если я посмотрю ps -aux
после выполнения моей оболочки sudo ls
, я вижу следующее:
root 4795 0.0 0.0 4496 1160 pts/29 S+ 16:51 0:00 sudo ls
root 4796 0.0 0.0 0 0 pts/29 Z+ 16:51 0:00 [ls] <defunct>
Итак, sudo
побежал и получил назначенный pid = 4795
, при этом дочерний (ls) был назначен 4796
. Ребенок выполнил свою задачу и сейчас сидит в состоянии зомби. sudo
, похоже, не хочет использовать процесс зомби и просто сидит там.
Я хотел бы знать, что вызывает это поведение. Я пробовал разные методы для очистки этих процессов зомби, таких как запуск моей оболочки под sudo
и ожидание непосредственно на sudo
и PID
, которые sudo
выполняется (4796 в приведенном выше примере). Ни один из этих методов не работал.
Как всегда, любой совет приветствуется.