函数wait和waitpid

函数wait

一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个,这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除这个进程,我们知道一个进程的退出状态可以在shell用特殊变量$?查看,因为shell是它的父进程,当它终止时shell调用wait或waitpid得到它的退出状态同时彻底清除这个进程。

1. 函数wait:一次只能回收一个子进程

pid_t wait(int *status);   status传出参数

进程终止时,操作系统隐式回收机制会:1. 关闭所有的文件描述符 2. 释放用户空间分配的内存。内核PCB仍存在,其中保存该进程的退出状态。(正常终止--------退出值;异常终止-------终止信号)

可使用wait函数传出参数status来保存进程的退出状态,借助宏函数来进一步判断进程终止的具体原因,宏函数可分为三组:

  1. WIFEXITED(status):为非0,进程正常结束;WEXITSTATUS(status) :如上宏为真,使用此宏  获取进程退出状态(exit的参数)
  2. WIFSIGNALED(status):为非0,进程异常终止;WTERMSIG(status):如上宏为真,使用此宏  获取进程终止的那个信号编号
  3. WIFSTOPPED(status) :为非0,进程处于暂停状;WSTOPSIG(status):如上宏为真,使用此宏  获取进程暂停的那个信号编号

 1. 测试代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/wait.h>
 5
 6 int main(void)
 7 {
 8     pid_t pid, wpid;
 9     pid = fork();
10
11     if(pid == 0)
12     {
13         printf("---child, my parent = %d, going to sleep 10s\n", getpid());
14         sleep(10);
15         printf("---------child die --------------\n");
16     }
17     else if(pid > 0)
18     {
19         wpid = wait(NULL);
20         if(wpid == -1)
21         {
22             perror("wait error: ");
23             exit(1);
24         }
25         while(1)
26        {
27             printf("I am parent, pid = %d, my son = %d\n", getpid(), pid);
28             sleep(1);
29         }
30     }
31     else
32     {
33         perror("fork");
34         return 1;
35     }
36     return 0;
37 }

输出结果

原文地址:https://www.cnblogs.com/sunbines/p/10263614.html

时间: 2024-08-02 15:13:31

函数wait和waitpid的相关文章

阻塞进程函数 wait()和waitpid()

1.  wait()和waitpid()函数说明 wait() 进程一旦调用了wait(), 就立即阻塞自己,由wait自动分析是否有当前进程的某个子进程已经退出,如果让它找到了一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回:如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到一个子进程结束或者该进程接到了一个指定的信号为止. waitpid() waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一

wait函数与waitpid函数

1. 通过man命令学习wait和waitpid函数的用法 wait与waitpid函数头文件与定义 #include<sys/types.h> #include<wait.h> pid_t wait(int *wstatus) pid_t waitpid(pid_t pid,*wstatus,int options); wait函数功能:父进程一旦调用wait函数就立即阻塞自己,由wait分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就

对于linux下system()函数的深度理解(整理)

对于linux下system()函数的深度理解(整理) (2013-02-07 08:58:54) 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system()函数要慎用要少用要能不用则不用,system()函数不稳定?

linux中waitpid及wait的用法【转】

wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wait (int * status); 函数说明: wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束. 如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一起返回. 如果不在意结束状态值,则参数 statu

linux 进程等待 wait 、 waitpid

waitpid() 与 wait() 功能相似,都是用户主进程等待子进程结束或中断. 可用于进程之间的同步 wait 函数原型 pid_t wait(int *status); 函数说明 wait() 会临时停止眼下进程的运行,直到有信号来到或子进程结束.假设在调用wait() 时子进程已经结束,则 wait() 会立即返回子进程结束状态值.子进程的结束状态值会由參数 status 返回,而子进程的进程识别码也会一块返回.假设不在意结束状态值,则參数ststus能够设为 NULL.子进程的结束状

【C/C++】Linux下system()函数引发的错误

http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食  恋恋美食 发布时间: 2012/04/21 11:33 阅读: 11393 收藏: 21 点赞: 8 评论: 4 今天,一个运行了近一年的程序突然挂掉了,问题定位到是system()函数出的问题,关于该函数的简单使用在我上篇文章做过介绍: http://my.oschina.net/renhc/blog/53580 先看一下问题 简单封装了一下sys

system函数遇到的问题 - 程序死掉

system函数遇到的问题 解决方案见最下边 http://blog.csdn.net/yangzhenzhen/article/details/51505176 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为是其他的代码影响到这个,或是内核驱动文件系统什么的异常导致,昨天有出现了这个问题,就随手百了一下度,问题出现了,很多人都说system(

SIGCHLD和wait/waipid函数的关系

SIGCHILD只是在子进程退出的时候发送给父进程的一个信号值,这是一种异步通知父进程的方式.父进程可以捕获,忽略这个信号,默认动作是忽略此信号. 常用的使用方式是,当SIGCHILD信号发生时候,主进程在SIGCHILD的信号处理函数中调用waitpid or wait来回收子进程的结束状态.但需要明白的是:waitpid or wait不是依靠SIGCHLD信号是否到达来判断子进程是否结束,(可能是通过轮巡检测子进程状态来判断的,需要看具体代码实现才能确定),即wait/waitpid并不依

【转】linux中waitpid及wait的用法

原文网址:http://www.2cto.com/os/201203/124851.html wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wait (int * status); 函数说明: wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束. 如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值. 子进程的结束状态值会由参数 s