Linux系统编程 75 -wait回收子进程

本文介绍了面试中常见的进程概念,包括僵尸进程、孤儿进程和守护进程。重点讲解了父进程如何通过wait函数回收子进程资源,如阻塞等待、资源回收和获取退出状态。示例代码展示了wait函数的使用,以及如何检查退出状态以获取进程死亡信息。

学习笔记

面试经常问到什么是僵尸进程,孤儿进程, 守护进程

守护进程后面再讲。

父进程回收子进程PCB,如何回收子进程资源?
通过wait 函数和 waitpid 函数来处理

wait 函数
每一进程结束之后,都会在内核残留PCB。
PCB 残留的目的是为了方便获取它的终止状态。

父进程调用wait 函数可以回收子进程终止信息,该函数有三个功能:
1.阻塞等待子进程退出
  表示调用函数之后,一直等待子进程退出,而且是死等。
2.回收子进程残留资源
3.获取子进程结束状态(退出原因)


 #include <sys/types.h>
 #include <sys/wait.h>

 pid_t wait(int *wstatus);
 
第一参数: 表示传出参数
返回值: 成功 :返回终止孩子的pid
               失败 : -1
         

$cat wait.c
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

int main(int argc, char **argv)
{
    pid_t pid,wpid;
    int status;

    pid = fork();

    if(0 ==  pid)
    {
        printf("---child, my parent is %d,going to sleep 10s\n",getppid());
        sleep(10);
        printf("-------child die!-------\n");
    }
    else if( pid > 0)
    {
        wpid = wait(&status);
        if(-1 == wpid)
        {
            perror("wait error!");
            exit(1);
        }

        printf("--------parent wait finish\n");

    }
    else
    {
        perror("fork");
        exit(1);
    }
    return 0;
}
$make wait
gcc  wait.c -o wait -Wall -g
$./wait
---child, my parent is 3550,going to sleep 10s
-------child die!-------
--------parent wait finish

退出状态可以描述进程死亡信息。


WIFEXITED(status)
返回值为真,正常退出

WEXITSTATUS(status)
返回子进程退出的状态


WIFSIGNALED(status)
如果被信号杀死,则返回为真

WTERMSIG(status)
返回杀死子进程的信号编号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值