请问一个关于僵尸进程的有关问题

请教一个关于僵尸进程的问题
需要做一个进程监控程序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可以在子进程未退出时直接返回而不等待,但后面还是要继续判断处理。