linux下编程wait()和waitpid()函数

wait()函数

进程终止以后,还有部分系统资源占用,这时候需要系统来回收进程的资源,方便资源的再利用。Linux系统下是父进程调用wait(2)家族的系统调用来回收子进程的资源,同时还可以检测子进程的终止原因。
pid_t wait(int *status)
功能:阻塞等待子进程结束,然后回收子进程的资源
参数:status:用于存储子进程的退出状态码。
返回值:成功 终止子进程的pid 错误 -1 errno做相应的设置
我们得到的status状态可以用系统的宏进行判断:
WIFEXITED(status):如果进程正常终止,返回真。这种情况下可以使用宏 WEXITSTATUS(status)获取进程的退出状态码。WIFSIGNALED(status):如果进程是被信号打断,返回真。这种情况下可以使用宏WTERMSIG(status)获取打断进程的信号的编号。
可以使用命令给进程发送信号:kill -信号编号 进程的pid
linux下编程wait()和waitpid()函数_第1张图片
因为wait命令会产生阻塞所以这个程序子进程会先执行。
linux下编程wait()和waitpid()函数_第2张图片

linux下编程wait()和waitpid()函数_第3张图片
使用系统所给的宏来看子进程的状态
在这里插入图片描述
正常退出子进程,发生的信号
在这里插入图片描述
使用kill命令异常杀死子进程,所产生的信号

waitpid()函数

pid_t waitpid(pid_t pid,int *status,int options);
功能:阻塞等待子进程结束,然后回收子进程的资源
参数: pid:指定要回收的子进程的pid
status:用于存储子进程的退出状态码
options:0 阻塞等待子进程的结束。 WNOHANG非阻塞
返回值:成功 终止子进程的pid。如果options的值为WNOHANG,要回收的子进程还没有结束,返回0.
错误 -1 errno做相应的设置。
宏的使用等同于wait(2).
pid参数取值说明
<-1:pid的绝对值指定了进程组的id。等待该组的子进程的终止
-1:等待任意子进程
0:等待和父进程同组的子进程

0:pid的值指定了要等待的子进程的pid

孤儿进程

孤儿进程:父进程已经终止,子进程还没有结束,将子进程的父进程设置为init进程,这样的子进程称为孤儿进程。init称为孤儿院(linux版本不同孤儿进程给的地方也不同)
僵尸进程:子进程已经结束,但是父进程还没有回收子进程的资源,这时候子进程处于僵尸状态,这样的子进程称为僵尸进程。

孤儿进程测试代码:
linux下编程wait()和waitpid()函数_第4张图片
linux下编程wait()和waitpid()函数_第5张图片
可以发现子进程的父进程pid不同

你可能感兴趣的:(C语言,linux,arm,物联网)