请问一个关于僵尸进程的有关问题
请教一个关于僵尸进程的问题
需要做一个进程监控程序M,对A、B、C、D等多个程序(或者进程)进行监控,可以通过M启动A、B、C、D,也可以通过M关闭A、B、C、D;
启动已经实现了,是在M中创建一个子进程,然后在子进程中启动程序(或者进程),并记录下改子进程的pid;
但是关闭的时候,想直接kill想对应的子进程ID,但是,这样会kill不掉,子进程会编程僵尸进程,请问有没有比较好的方法啊,找不到比较好的方法。[/size]
------解决思路----------------------
使用 wait
http://no001.blog.51cto.com/1142339/493589
http://man7.org/linux/man-pages/man2/waitpid.2.html
------解决思路----------------------
http://www.studyemb.cn/forum.php?mod=viewthread&tid=4&extra=page%3D1
------解决思路----------------------
http://www.cnblogs.com/anker/p/3271773.html
2种办法,一种就是主进程wait,还有一种就是主进程fork完之后忽略SIGCHLD。
------解决思路----------------------
子进程变成僵尸进程,楼主写的父进程应该是设计的没有时间收回子进程咯,可以考虑在父进程中有时间回收子进程,当然思路很重要啦, 3楼的建议也不错的
------解决思路----------------------
让父进程创建的子进程a再去创建一个子进程b去执行程序,然后子进程a退出,这样由于a已结束,其子进程b就会由init进程接管,就不会有僵尸进程了
------解决思路----------------------
kill -9 呢
------解决思路----------------------
直接kill,然后解决僵尸进程的问题比较简单。
方法如上述楼层
1)忽略SIGCHILD信号,这个方式最简单,但有时会给其他程序带来影响
struct sigaction sa;
sa.sa_handler = SIG_IGN;
#ifdef SA_NOCLDWAIT
sa.sa_flags = SA_NOCLDWAIT;
#else
sa.sa_flags = 0;
#endif
sigemptyset (&sa.sa_mask);
sigaction (SIGCHLD, &sa, NULL);
其中sigaction (SIGCHLD, &sa, NULL);换作sigaction (SIGCHLD, &new_sa, &old_sa);可以使用old_sa来保存之前的,之后可以再用sigaction (SIGCHLD, &old_sa, NULL);来恢复。
2)利用孙子进程来处理事务,fork两次
pid_t pid;
pid = fork();
if (pid < 0){
printf ("Error to fork while focus out/n");
}else if(pid == 0){
pid = fork();
if (pid < 0){
printf ("Error to fork while focus out/n");
}else if(pid == 0){
//孙子进程处理
execlp ("gedit","gedit",NULL, NULL);
}else{
exit(0); //子进程退出
}
}
//父进程继续
3)使用waitpid或者wait来处理
其中waitpid(pid, NULL, WNOHANG);使用参数WNOHANG可以在子进程未退出时直接返回而不等待,但后面还是要继续判断处理。
需要做一个进程监控程序M,对A、B、C、D等多个程序(或者进程)进行监控,可以通过M启动A、B、C、D,也可以通过M关闭A、B、C、D;
启动已经实现了,是在M中创建一个子进程,然后在子进程中启动程序(或者进程),并记录下改子进程的pid;
但是关闭的时候,想直接kill想对应的子进程ID,但是,这样会kill不掉,子进程会编程僵尸进程,请问有没有比较好的方法啊,找不到比较好的方法。[/size]
------解决思路----------------------
使用 wait
http://no001.blog.51cto.com/1142339/493589
http://man7.org/linux/man-pages/man2/waitpid.2.html
------解决思路----------------------
http://www.studyemb.cn/forum.php?mod=viewthread&tid=4&extra=page%3D1
------解决思路----------------------
http://www.cnblogs.com/anker/p/3271773.html
2种办法,一种就是主进程wait,还有一种就是主进程fork完之后忽略SIGCHLD。
------解决思路----------------------
子进程变成僵尸进程,楼主写的父进程应该是设计的没有时间收回子进程咯,可以考虑在父进程中有时间回收子进程,当然思路很重要啦, 3楼的建议也不错的
------解决思路----------------------
让父进程创建的子进程a再去创建一个子进程b去执行程序,然后子进程a退出,这样由于a已结束,其子进程b就会由init进程接管,就不会有僵尸进程了
------解决思路----------------------
kill -9 呢
------解决思路----------------------
直接kill,然后解决僵尸进程的问题比较简单。
方法如上述楼层
1)忽略SIGCHILD信号,这个方式最简单,但有时会给其他程序带来影响
struct sigaction sa;
sa.sa_handler = SIG_IGN;
#ifdef SA_NOCLDWAIT
sa.sa_flags = SA_NOCLDWAIT;
#else
sa.sa_flags = 0;
#endif
sigemptyset (&sa.sa_mask);
sigaction (SIGCHLD, &sa, NULL);
其中sigaction (SIGCHLD, &sa, NULL);换作sigaction (SIGCHLD, &new_sa, &old_sa);可以使用old_sa来保存之前的,之后可以再用sigaction (SIGCHLD, &old_sa, NULL);来恢复。
2)利用孙子进程来处理事务,fork两次
pid_t pid;
pid = fork();
if (pid < 0){
printf ("Error to fork while focus out/n");
}else if(pid == 0){
pid = fork();
if (pid < 0){
printf ("Error to fork while focus out/n");
}else if(pid == 0){
//孙子进程处理
execlp ("gedit","gedit",NULL, NULL);
}else{
exit(0); //子进程退出
}
}
//父进程继续
3)使用waitpid或者wait来处理
其中waitpid(pid, NULL, WNOHANG);使用参数WNOHANG可以在子进程未退出时直接返回而不等待,但后面还是要继续判断处理。