僵尸进程和孤儿进程

1.父子进程的关系
独立的两个进程
互为父子关系
2.问题:
2.1.父进程先结束?
子进程就依托根进程init:孤儿进程
孤儿进程没有任何危害.
2.2.子进程先结束?
子进程会成为僵死进程.
僵死进程表面上不占用内存,CPU.但在进程任务管理树占用一个节点.
僵死进程造成进程名额资源浪费.(假如,我的程序里面最大允许有100个进程,当有100
个僵尸进程的时候,就不能跑起来其他进程了)
所以处理僵死进程.
3.僵死进程使用wait回收 不是杀死子进程哦。。。保持。。阻塞。。直到回收。
man 2 wait查看帮助
pid_t wait(int *status); 返回子进程的pid,并把子进程的状态信息保存到status中(如:子进程exit(88))
printf("%d\n",WEXITSTATUS(status));//返回状态88

4.父进程怎么知道子进程退出?
子进程结束通常会向父进程发送一个信号
SIGCHLD 17
这样父进程就不用傻傻的wait阻塞了,就可以去做其他事。
5.父进程处理子进程退出信号
signal(int sig,void(*fun)(int));
函数作用。。向系统注册:只要sig信号发生,系统停止进程,并调用函数fun
当函数执行完毕,继续原来进程
步骤:
5.1.实现处理函数
5.2.使用signal邦定信号与函数
僵死进程回收模型 案例: parentchild.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
void deal(int s)
{
    int status;
    wait(&status);
    printf("回收中.....\n");
    sleep(5);    
    printf("回收完毕:%d!\n",WEXITSTATUS(status));
            
}
main()
{
    if(fork()==0)
    {
        //child
        printf("child!\n");
        sleep(20);
        printf("退出!\n");
        exit(88);
    }
    else
    {        
        //parent
        /*
        int staus;
        wait(&status);
        printf("%d\n",WEXITSTATUS(status));//返回状态88
        */
        signal(17,deal);
        //while(1)
        //{
        //    printf("parent!\n");        
        //    sleep(1);
        //}
        sleep(20000);
        printf("parent!\n");
    }
}

 

posted @ 2017-02-28 16:18  ren_zhg1992  阅读(97)  评论(0)    收藏  举报