linux 僵尸进程解决办法

来源:互联网 发布:linux系统ping不通 编辑:程序博客网 时间:2024/06/06 00:26

一、现象:无法使用 kill  -9  20592 , 杀死该子进程


二、原因:

父进程在fork产生子进程后,如果子进程死了,父进程没有进行回收,就会产生僵尸进程。

三、解决办法:

1、结束父进程,由父进程产生的僵尸进程也会回收处理

2、捕获子进程结束发给父进程的SIGCHLD信号,收到信号后执行waitpid函数进行回收处理

 pid_t waitpid(pid_t pid, int *status, int options);

a、pid的参数说明:

pid<-1等待进程组号为pid绝对值的任何子进程。
pid=-1 等待任何子进程,此时的waitpid()函数就退化成了普通的wait()函数。
pid=0 等待进程组号与目前进程相同的任何子进程,也就是说任何和调用waitpid()函数的进程在同一个进程组的进程。
pid>0 等待进程号为pid的子进程。

b、status参数说明:

不关心子进程结束状态,直接传入NULL;

WIFEXITED(status)如果子进程正常结束,它就返回真;否则返回假。
WEXITSTATUS(status) 如果WIFEXITED(status)为真,则可以用该宏取得子进程exit()返回的结束代码。
WIFSIGNALED(status) 如果子进程因为一个未捕获的信号而终止,它就返回真;否则返回假。
WTERMSIG(status) 如果WIFSIGNALED(status)为真,则可以用该宏获得导致子进程终止的信号代码。
WIFSTOPPED(status) 如果当前子进程被暂停了,则返回真;否则返回假。
WSTOPSIG(status) 如果WIFSTOPPED(status)为真,则可以使用该宏获得导致子进程暂停的信号代码。

c、options:

不使用该参数功能, 传入0;

WNOHANG如果pid指定的子进程没有结束,则waitpid()函数立即返回0,而不是阻塞在这个函数上等待;

如果结束了,则返回该子进程的进程号。
WUNTRACED 如果子进程进入暂停状态,则马上返回


原创粉丝点击