当前位置: 技术问答>linux和unix
fork后的僵尸进程到底怎么干掉
来源: 互联网 发布时间:2015-10-30
本文导语: 查了网上一大堆的资料 就一个方法,在父进程中接管SIGCHLD信号 我试了半天也不行 哪位大侠给点可用代码…… | pid_t waitpid(pid_t pid, int *status, int options); | 处理SIGCHLD信号。SIGCHLD信号...
查了网上一大堆的资料
就一个方法,在父进程中接管SIGCHLD信号
我试了半天也不行
哪位大侠给点可用代码……
就一个方法,在父进程中接管SIGCHLD信号
我试了半天也不行
哪位大侠给点可用代码……
|
pid_t waitpid(pid_t pid, int *status, int options);
|
处理SIGCHLD信号。SIGCHLD信号是子进程结束时,向内核发送的信号。
如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。可以用如下语句:
signal(SIGCHLD,(void *)reap_status);
捕捉信号SIGCHLD,用下面的函数进行处理:
void reap_status()
{ int pid;
union wait status;
while ((pid = wait3(&status,WNOHANG,NULL)) > 0)
…… }
如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。因此需要对SIGCHLD信号做出处理,回收僵尸进程的资源,避免造成不必要的资源浪费。可以用如下语句:
signal(SIGCHLD,(void *)reap_status);
捕捉信号SIGCHLD,用下面的函数进行处理:
void reap_status()
{ int pid;
union wait status;
while ((pid = wait3(&status,WNOHANG,NULL)) > 0)
…… }
|
楼主在主进程中调用一下wait()试一下
..
...
//杀死子进程
kill(pid, SIGKILL);
//这时可能产生僵尸进程,调用wait
if (wait(NULL)) {
syslog(LOG_INFO, "wait error");
}
我的程序这么弄就好用了,你试一下吧,我不保证对。
..
...
//杀死子进程
kill(pid, SIGKILL);
//这时可能产生僵尸进程,调用wait
if (wait(NULL)) {
syslog(LOG_INFO, "wait error");
}
我的程序这么弄就好用了,你试一下吧,我不保证对。
|
wait3要看你的系统支持与否。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。