当前位置: 技术问答>linux和unix
主进程退出怎么同时也吧开的子进程关掉啊
来源: 互联网 发布时间:2015-05-18
本文导语: 主进程退出怎么同时也吧开的子进程关掉啊是不是用信号 | 除了牛牛说的给子进程发送SIGKILL信号外,为了避免父进程先于子进程死掉从而产生僵死进程,一般需要在父进程中处理SIGCHLD信号,且...
主进程退出怎么同时也吧开的子进程关掉啊是不是用信号
|
除了牛牛说的给子进程发送SIGKILL信号外,为了避免父进程先于子进程死掉从而产生僵死进程,一般需要在父进程中处理SIGCHLD信号,且在信号处理函数中使用waitpid等待子进程状态改变。如:
main()
{
...
signal(SIGTERM,exit_proc);
signal(SIGINT,exit_proc);//主进程捕捉kill信号
signal(SIGCHLD,sig_child);//捕捉子进程信号
....
//fork.....
...
//to exit
kill(childpid1,SIGKILL);
kill(childpid2,SIGKILL);
..
waitpid(-1,&status,WNOHANG);
..
}
int sig_child(int sig)
{
int status;
while(waitpid(-1,&status,WNOHANG) > 0)
;
signal(SIGCHLD,sig_child); //若有多个子进程,需要充值对sigchld信号的处理
return;
}
main()
{
...
signal(SIGTERM,exit_proc);
signal(SIGINT,exit_proc);//主进程捕捉kill信号
signal(SIGCHLD,sig_child);//捕捉子进程信号
....
//fork.....
...
//to exit
kill(childpid1,SIGKILL);
kill(childpid2,SIGKILL);
..
waitpid(-1,&status,WNOHANG);
..
}
int sig_child(int sig)
{
int status;
while(waitpid(-1,&status,WNOHANG) > 0)
;
signal(SIGCHLD,sig_child); //若有多个子进程,需要充值对sigchld信号的处理
return;
}
|
用kill(0, SIGTERM)给进程组发送SIGTERM信号。最好不要用SIGKILL,因为无法捕获,如果子进程有什么后事要办,收到SIGKILL就来不及办了。
|
用waitpid等子进程都退出后,主进程再退出
|
不需要。只要父进程给子进程发送了TERM信号,父进程就可以退出了。内核会把没有父进程的子进程的父进程设置为init,init会调用wait回收子进程的资源。