我目前正在编写一个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)。这些技术都没有奏效。PIDsudo
与往常一样,我们将不胜感激任何建议。