man wait

man waitpid





从中可知

函数原型

pid_t wait(int* status);
pid_t waitpid(pid_t pid, int* status, int options);

函数说明

父进程创建子进程之后,父进程使用wait和waitpid具有监视子进程的运行状态的能力。这两个函数用于等待子进程的状态发生变化回调并且获取状态发生变化的信息,所能获取的状态变化包括:子进程运行结束,子进程被信号量暂停,子进程被信号量回复运行。

父进程执行wait函数之后,父进程会被阻塞在此处,如果子进程状态发生变化,则wait函数会立即返回结果;否则wait函数会一直阻塞直到子进程状态发生变化。

通常意义上,,如果子进程状态发生了变化,但是还是未被其父进程或者其他系统回调执行wait函数,此时的子进程被称为可等待的。

子进程运行结束后父进程执行wait函数可以推动系统释放与子进程相关的资源;否则子进程将会被维持在僵尸进程(子进程已结束,而父进程还在运行)的状态下一直存在。

返回值说明

上述函数的返回值有-1,0,>0三种情况。分别对应于以下三种情况返回。

-1:调用出错,此时出错信息在errno中

0:若waitpid的options设置了WNOHANG,且调用中没有子进程退出,立即返回0

0:若大于0,返回退出进程的pid。

参数说明

pid:要监听的进程的ID(<-1, =-1, =0, > 0)

status: 用于存储出发状态变化时的信号值和exit(code)中的code值。

options 提供一些额外的选项控制waitpid,目前linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数宏,可以使用|连接使用.

pid详细说明:

pid < -1 : 监听范围为进程组为-pid的所有子进程

pid = -1 : 监听范围为调用wait/waitpid的所有子进程

pid = 0: 监听范围为子进程的进程组ID(与父进程相等)

pid > 0: 监听特定pid的进程

status详细说明

status用于保存出发wait的信号值或者退出时exit(code)中的code值

options详细说明

WNOHANG : 使用此参数调用waitpid,即使子进程没有退出,他也会立即返回,而不是像wait一直等下去

WUNTRACED : 用于调试,极少用

一般情况下使用值为0即可。

wait与waitpid关系

wait实质上是waitpid中pid=-1,options=0时封装,即

wait(&status)与waitpid(-1, &status, 0)完全相同,这是wait函数和waitpid的最本质关系。

函数调用示例:

#include <sys/types.h>

#include <sys/wait.h>

#include <unistd.h>

#include <stdlib.h>

main()

{

    pid_t pc,pr;
int a; pc=fork(); if(pc<0) printf("error ocurred!/n"); else if(pc==0){ printf("This is child process with pid of %d\n",getpid()); } else{
printf("this is parent process\n"); pr=wait(&a); printf("I catched a child process with pid of %d\n",pr); } exit(0); }

执行可以发现,父进程执行到wait函数时阻塞,然后系统执行子进程,结束之后通过pr返回结束进程的进程号,同时给一个int指针a,可以查看进程的情况。

因为wait函数本质是,waitpid函数的定参封装,内部实现相同,故给出一个waitpid()的调用实例:

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h> int main(){
pid_t pc,pr;
pc=fork(); if(pc<0) printf("error"); else
if(pc==0){
sleep(10);
exit(0);
}
do{
pr=waitpid(pc,NULL,WNOHANG);
if(pr==0){
printf("we haven't get the child process\n");
sleep(1);
}
}while(pr==0);
if(pr==pc)
printf("we get the child process\n");
}

如果判断自身为子进程,则睡眠十秒钟,在此期间的父进程并没有被阻塞,还在不断的通过do循环接收子进程的执行情况,每次判断间隔

一秒钟。最终十秒后获得了子进程结束的标志,打印we get the child process

wait,waitpid的学习使用的更多相关文章

  1. UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

    lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...

  2. wait,waitpid学习测试

    用man wait学习wait waitpid的使用 wait()函数功能:wait()函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行的子进程的PID. 参数status所 ...

  3. linux c学习笔记----进程创建(fork,wait,waitpid)

    1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己 ...

  4. Linux内核学习笔记(4)-- wait、waitpid、wait3 和 wait4

    进程调用 exit() 退出执行后,被设置为僵死状态,这时父进程可以通过 wait4() 系统调用查询子进程是否终结,之后再进行最后的操作,彻底删除进程所占用的内存资源. wait4() 系统调用由 ...

  5. APUE学习笔记——10.18 system函数 与waitpid

    system函数 system函数用方便在一个进程中执行命令行(一行shell命令). 用法如下: #include <stdio.h> #include <stdlib.h> ...

  6. [学习笔记]父进程wait和waitpid

    1.wait和waitpid出现的原因 SIGCHLD q  当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) q  子进程退 ...

  7. waitpid()系统调用学习

    waitpid()的头文件 #include <sys/types.h>  #include <sys/wait.h> pid_t waitpid(pid_t pid,int ...

  8. Linux 等待进程结束 wait() 和 waitpid()

    若子进程先于父进程结束时,父进程调用wait()函数和不调用wait()函数会产生两种不同的结果: --> 如果父进程没有调用wait()和waitpid()函数,子进程就会进入僵死状态. -- ...

  9. 详解wait和waitpid函数

    #include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status) ...

随机推荐

  1. Golang 实现 Redis(4): AOF 持久化与AOF重写

    本文是使用 golang 实现 redis 系列的第四篇文章,将介绍如何使用 golang 实现 Append Only File 持久化及 AOF 文件重写. 本文完整源代码在作者GithubHDT ...

  2. 1068 Find More Coins (30分)(dp)

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  3. Spring Taco Cloud——design视图的创建(含thymeleaf模板遇到的一些小问题)

    先来看下综合前两篇内容加上本次视图的成果   可能不是很美观,因为并没有加css样式,我想等整个项目有个差不多的功能实现后再进行页面优化,请谅解 下面我贴上自己定义修改过的Taco的design视图代 ...

  4. 对Web语义化的思考。

    很有意思的HTML语义化 在昨天和做SEO的同学聊了一会儿,当然我没有学会搜索引擎优化的技巧和知识,但在此之前一直对HTML5中header.footer.sidebar.article等标签嗤之以鼻 ...

  5. 数据结构和算法(Golang实现)(28)查找算法-AVL树

    AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树. 一.AVL树介绍 AVL树是一棵严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和La ...

  6. 07-rem

    一.什么是rem rem(font size of the root element)是指相对于根元素`的字体大小的单位.它就是一个相对单位. px:一个绝对单位 em:一个相对单位,根据的是当前盒子 ...

  7. 【Java】标识符 & 命名规则

    Java的标识符和命名规则 什么是标识符[Identifier]? 指用来标识某个实体的一个符号.在不同的应用环境下有不同的含义. 在编程语言中,标识符是开发者编程时使用的名字,对于变量.常量.函数. ...

  8. php.ini中文详解

    [PHP] ;;;;;;;;;;;;;;;;;;;;;;; ; 关于 php.ini 配置文件 ; ;;;;;;;;;;;;;;;;;;;;;;; ; PHP 的初始化文件, 必须命名为 php.in ...

  9. Linux-设备

    一.在Linux系统中,每个设备都被当成一个文件来对待. 在Linux系统中,几乎所有的硬件设备都在/dev这个目录内.

  10. stand up meeting 12-7

    weekend updates: 1.答题界面和结果界面的跳转和数据传输已全部完成. 2.答题界面完成简单的getRankingData API结果展示,答题时间,错误数目和错题题目的展示,点击题目可 ...