孤儿进程,僵尸进程

孤儿进程

  如果父进程先退出,子进程还没退出那么子进程将被 托孤给init进程,这是子进程的父进程就是init进程(1号进程).其实还是很好理解的

僵尸进程

有如果一个进程已经终止了,但是其父进程还没有获取其状态,那么这个进程就称之为僵尸进程.僵尸进程还会消耗一定的系统资源,并且还保留一些概要信息供父进程查询子进程的状态可以提供父进程想要的信息.一旦父进程得到想要的信息,僵尸进程就会结束.

僵尸进程避免
1 signal(SIGCHLD,SIG_IGN);

当子进程结束时,操作系统回向父进程发SIGCHLD信号,父进程对这个信号有个默认处理函数,这个默认处理函数就是什么都不做,如果父进程signal(SIGCHLD,SIG_IGN),就是告诉操作系统,自己忽略该信号,那操作系统就会自己处理该信号,操作系统处理方法就是自己回收。

#include<stdio.h>
#include <unistd.h>
#include<signal.h>
#include <sys/types.h>

void signal_wait(int isig)  
{  
    wait(NULL);  
    printf("child is cleaned\n");  
}  

int main(void)
{
        pid_t pid ;
        signal(SIGCHLD,SIG_IGN);          //1
        //signal(SIGCHLD,signal_wait);    //2
        printf("before fork pid:%d\n",getpid());
        int abc = 10;
        pid = fork();
        if(pid == -1)
        {
                perror("tile");
                return -1;
        }
        if(pid > 0)
        {
                abc++;
                printf("parent:pid:%d \n",getpid());
                printf("abc:%d \n",abc);
                sleep(20);
                sleep(10);
        }
        else if(pid == 0){
                abc++;
                printf("child:%d,parent: %d\n",getpid(),getppid());
                printf("abc:%d",abc);
                exit(0);
        }
        printf("fork after...\n");
}
2 signal(SIGCHLD,handler);

父进程自己处理,可以在hander函数中用waitpid或wait回收。将上面代码的1处屏蔽,换为2。

3 父进程在fork子进程后,用wait()阻塞等待。
4 杀死父进程

杀死父进程后,子进程就会成为孤儿进程,然后系统就会将该孤儿进程过继给init进程,如果子进程退出后,init进程就会立马直接将其回收.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值