В настоящее время я пишу оболочку. Я выполняю процессы и использую обработчик сигнала 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 в приведенном выше примере). Ни один из этих методов не сработал.
Как всегда, любой совет будет принят с благодарностью.