我目前正在编写一个shell。我执行进程并SIGCHLD
在它们完成时使用信号处理程序来清理(等待它们)。
一切正常——除非我执行使用sudo
. 在这些情况下,我永远不会收到SIGCHLD
信号——所以我永远不知道进程已经完成执行。
当我收到诸如 之类的命令时sudo ls
,我执行程序sudo
,然后ls
作为参数提供。我用execvp
.
如果我ps -aux
在我的 shell 执行后查看一下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
似乎不想收获僵尸进程,只是坐在那里。
我想知道是什么导致了这种行为——我尝试了不同的技术来清理这些僵尸进程,例如在下面运行我的 shellsudo
并直接等待,然后sudo
执行(上面示例中的 4796)。这些技术都没有奏效。PID
sudo
与往常一样,我们将不胜感激任何建议。