当前位置: 技术问答>linux和unix
【急】 程序在IBM AIX 4.3下面跑时出好多僵尸进程,咋办呢?
来源: 互联网 发布时间:2015-06-07
本文导语: 程序里面只是定时用popen()去产生新的进程,从未直接调用fork(),在RedHat 7.2/8.0和Solaris 2.8上跑没问题,但是在AIX 4.3下面跑就会随机地出现僵尸进程(就是进程名为“[]”的那种)。 程序是在shell命令行用&来后台运...
程序里面只是定时用popen()去产生新的进程,从未直接调用fork(),在RedHat 7.2/8.0和Solaris 2.8上跑没问题,但是在AIX 4.3下面跑就会随机地出现僵尸进程(就是进程名为“[]”的那种)。
程序是在shell命令行用&来后台运行的。已按如下方式处理了SIGCLD信号:
void sig_child(int signo)
{
while (waitpid(-1, NULL, WNOHANG) > 0)
{
}
signal(SIGCHLD, sig_child);
}
程序是在shell命令行用&来后台运行的。已按如下方式处理了SIGCLD信号:
void sig_child(int signo)
{
while (waitpid(-1, NULL, WNOHANG) > 0)
{
}
signal(SIGCHLD, sig_child);
}
|
1.现在的信号好像是SIGCHLD,SIGCLD是老的信号~~
2.你可以用sigaction来禁止僵尸进程产生,代码如下:
struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flag = SA_NOCLDWAIT;
sigaction(SIGCHLD,act,NULL);
2.你可以用sigaction来禁止僵尸进程产生,代码如下:
struct sigaction act;
act.sa_handler = SIG_IGN;
sigemptyset(&act.sa_mask);
act.sa_flag = SA_NOCLDWAIT;
sigaction(SIGCHLD,act,NULL);
|
调用完popen()后再调用pclose()就行了,无需你自己去等待子进程。
|
你用signal(SIGCLD,SIG_IGN)试一下!
|
这应该是你上一个进程产生的僵尸,是不是你上一个进程没有回收信号呀