进程等待与终止

本文详细介绍了僵尸进程和孤儿进程的概念,以及如何使用wait和waitpid函数来处理子进程的状态。此外,还介绍了进程终止的多种方式及其区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

僵尸进程:一个子进程在其父进程没有调用 wait()waitpid()的情况下退出。这个子进程就是僵尸进程。如果其父进程还存在而一直不调用wait,则该僵尸进程将无法回收,等到其父进程退出后该进程将被init回收。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
******************************************************************************************************************************************************************
一、进程等待的函数 wait/waitpid
 
(1)wait 
参数:通过它拿到子进程的终止状态,如果不关心 ,可将它设置为NULL,它是一个输出型参数。
           子进程的退出码:status的次八位(status>>8)&0xff,也可以用宏WEXITSTATUS(status)查看;
            进程的终止情况:status的低八位(status&0xff),也可以用宏WIFEXITED(status)查看;当进程异常终止时,退出码无意义

返回值:成功->返回子进程的pid,失败->返回-1
功能:1、读取子进程退出状态;2、释放子进程的资源(PCB)

WEXITSTATUS(status)与WIFEXITED(status)宏解释:
WIFEXITED(status) :1.正常创建父子进程,子进程正常退出,父进程等待,并获取退出状status。调用该宏,查看输出结果(正常为非0,或1)。2.正常创建父子进程,子进pause(),父进程等待,并设置获取退出状态statuskill杀掉子进程,调用该宏,查看输出结果(结果为0)。
WEXITSTATUS(status) :WIFEXITED非零,返回子进程退出码,提取进程退出返回值,如果子进程exit(7),WEXITSTATUS(status)就会返回7.请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义.

(2) waitpid
返回值:1、当正常返回的时候waitpid返回收集到的子进程的进程ID
                2、如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0
                3、如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
                4、当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid会出错返回,这时errno被设置为ECHILD。                                                       
参数pid: 1、pid=-1,等待任一个子进程。与wait等效。
    2、pid>0.等待其进程ID 为pid的子进程。
    3、pid==0等待其组ID等于调用进程组ID的任一个子进程。
    4、pid<-1等待其组ID等于pid绝对值的任一子进程。
           status:WIFEXITED(status) :若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
                       WEXITSTATUS(status) :WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
           options:1、WNOHANG :pid指定的子进程没有结束,则waitpid()函数返回0,调用waitpid的进程不会被阻塞,将继续执 行;若正常结束,则返回该子进程的ID
                        2、  options==0:调用waitpid的进程会进行阻塞等待。
waiptpid提供了wait没有提供的三个功能:
1. waitpid可等待一个特定的进程
2. waitpid提供了一个wait的非阻塞版本
3. waitpid支持作业控制

waitpid的使用例子
子进程的执行流:(若不说明退出方式,它的退出方式默认为exit(0))
父进程的执行流:(因为是以非阻塞的方式等待子进程,在子进程没有退出时,waitpid的返回值一直都是0,所以要以循环的方式等待,直到waitpid的返回值为子进程的ID时,才等待成功)

******************************************************************************************************************************************************************
二、进程终止
(1)进程终止的方式有8种,前5种为正常终止,后三种为异常终止:
1main函数返回;
2调用exit函数;
3调用_exit_Exit
4最后一个线程从启动例程返回;
5后一个线程调用pthread_exit
6调用abort函数;
7接到一个信号并终止;
8最后一个线程对取消请求做出响应。
(2)exit与 _Exit,_exit的区别
          _exit_Exit立即进入内核,而exit则要先做一些清理工作(调用执行各终止处理程序,关闭所有标准I/O流),再进入内核。
#include <stdlib.h>
void exit( int status );
void _Exit( int status );
#include <unistd.h>
void _exit( int status );
这三个函数用于正常终止一个程序,三个函数所带的整型参数称为终止状态或退出状态,如果
a)调用这些函数不带参数;
bmain函数中的return语句无返回值;
cmain函数没有声明返回类型为整型;则进程的终止状态是未定义的。

main函数返回一个整型值与用该值调用exit是等价的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值