【发布时间】:2016-12-09 18:29:46
【问题描述】:
我正在调试一个遗留程序(在 Linux 上)。为了将它与另一个进程同步,我尝试天真地添加raise(SIGSTOP)。然而,当在sudo 下运行时,我得到一个已失效(僵尸)进程和一个挂起的终端。有人可以解释这里发生了什么以及如何避免它。
我已将问题简化为以下简单的 C 程序 (selfstop.c):
#include <signal.h>
#include <stdio.h>
int main(void)
{
printf("about to stop\n");
(void)raise(SIGSTOP);
printf("resumed\n");
return 0;
}
如果正常运行,它会显示“即将停止”并使用 SIGSTOP 自行停止。
kill -18 <pid> 使其显示“已恢复”并根据需要退出。
但是,如果我在sudo 下运行它,即
sudo ./selfstop
在另一个终端:
sudo kill -18 <pid>
它显示“恢复”并将控制权返回给终端,但我留下了一个已失效的进程:
>ps aux | grep [s]elf
root 7619 0.0 0.0 215476 4136 pts/4 T 18:16 0:00 sudo ./selfstop
root 7623 0.0 0.0 0 0 pts/4 Z 18:16 0:00 [selfstop] <defunct>
如果程序在脚本中运行 (runselfstop),情况会变得更糟:
#!/bin/sh
sudo ./selfstop
现在,当进程退出时,它会挂起终端。 在这两种情况下,通过终止 sudo 进程来恢复正常服务(在本例中为“7619 = sudo ./selfstop”:
sudo kill -9 7619
我的问题是我们为什么会得到僵尸以及如何避免它。
注意:这里与使用 sudo 的原因无关。它与旧版应用程序有关。
【问题讨论】: