Linux笔记(16)-孤儿进程和僵尸进程

  1. 孤儿进程
1. 父进程创建子进程后,父进程先结束,子进程任然存在  --  子进程称为孤儿进程
2. 孤儿进程会被系统init进程(不同系统的名称不同)领养,init进程变为孤儿进程的父进程
3. 领养操作是为了释放子进程占用的系统资源
    a. 进程结束后,能够自行释放用户区空间
    b. 进程释放不了pcb,必须由父进程释放,因此有init来释放
  1. 僵尸进程
1. 父进程创建子进程后,子进程结束
2. 父进程没有结束,因此,不会去释放子进程的pcb内存区
3. 子进程称为僵尸进程,是一个结束的进程
4. 使用ps aux命令可以查看到,在进程中,僵尸进程具有<defunct>标识
  1. 进程回收:wait函数 – 阻塞函数
1. 函数原型:
    pid_t wait(int *wstatus);
2. 参数
    wstatus:判定子进程是如何结束的
            定义一个int类型变量,然后传入变量地址,函数执行后,会将结果赋值给变量
3. 返回值
    -1:回收失败,没有子进程可以回收了
    >0:回收的子进程的pid
4. 例如:
    {
        int status;
        pid_t wpid = wait(&status);
        if (WIFEXITED(status))
            xxx;
        else if (WIFSIGNALED(status))
            xxx;
    }
    a. WIFEXITED(status):如果为非0,则表示进程正常结束。
        且WEXITSTATUS(status)为进程退出状态(exit(x);/return x;)的x值
    b. WIFSIGNALED(status):如果为非0,则表示进程异常终止(例如kill的信号终止)
        且WTERMSIG(status)为令进程异常终止的信号的编号
  1. 进程回收:waitpid函数 – 可设置阻塞或非阻塞,有选择的回收指定pid进程
1. 函数原型:
    pid_t waitpid(pid_t pid, int *wstatus, int options);
2. 参数:
    pid:
        a. pid == -1 表示等待任一子进程。与wait函数等效
        b. pid > 0   表示等待与pid相等进程ID的进程
        c. pid == 0  表示回收当前进程组的所有子进程,等待组ID与进程组ID相等的任一子进程
        d. pid < -1  表示等待组ID与pid的绝对值相等的任一子进程
        当需要回收所有子进程时,可以将pid设置为-1,放入while循环中,因为调用一次只回收一个
    wstatus:
        子进程的退出状态,与wait一致
    options:
        阻塞与非阻塞参数:WNOHANG -- 非阻塞
                            0     -- 阻塞
3. 返回值:
    >0:返回回收的子进程ID
    -1:无子进程可以回收
    0:当设置为非阻塞时,0表示子进程正在运行
  1. while循环调用waitpid
pid_t wpid;
while( (wpid = waitpid(-1, NULL, WNOHANG)) != -1)
{
    if(wpid == 0)   //表示进程还在执行
        continue;
    printf("child die, pid = %d\n",wpid);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值