1. 函数原型:

#include <sys/wait.h>

pid_t wait(int *statloc);

pid_t waitpid(pid_t pid, int *statloc, int options);

ret=成功返回进程ID或者0,失败返回-

(1) statloc是一个整型指针;如果statloc不是一个空指针,则终止进程的终止状态就存放在它指向的单元内;如果不关心终止状态,则可将该参数指定为空指针;

(2) waitpid中的pid参数作用如下:

pid==-1 等待任一子进程。这个waitpid与wait等效; wait(xx) == waitpid(-1, xx, 0);

pid>0 等待进程ID与pid相等的子进程;

pid==0 等待其组ID等于调用进程ID的任一子进程;

pid < -1 等待期组ID等于pid绝对值的任一子进程;

(3) waitpid的options常量:

0-不使用任何选项;

WCONTINUED-若支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态未被报告,则返回其状态;

WNOHANG-若pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0;

WUNTRACED-若某实现支持作业控制,而由pid指定的任一子进程已处于暂停状态,但是其状态自暂停以后还未报告过,则返回其状态;WIFSTOPPED宏确定返回值是否对应一个暂停子进程;

(4) 检查终止状态的宏:

WIFEXITED(status)-若为正常终止子进程返回的状态,则为真;对于这种情况可执行WEXITSTATUS(status),取子进程传送给exit, _exit, _Exit参数的低八位;

WIFSIGNALED(status)-若为异常终止子进程返回的状态,则为真(接到一个不捕捉的信号)。对于这种情况,可执行WTERMSIG(status),获取子进程终止的信号编号;另外有些实现定义宏WCOREDUMP(status),若以产生终止进程的core文件,则返回真;

WIFSTOPPED(status)-若为当前暂停进程的返回状态,则为真;对于这种情况,可执行WSTOPSIG(status),获取使子进程暂停的信号编号;

WIFCONTINUED(status)-若在作业控制暂停后,已经继续的子进程返回了状态,则为真;(仅用于waitpid)

2. wait与waitpid区别:

(1) 在一个进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可以使调用者不阻塞;

(2) waitpid并不等待其调用后的第一个终止子进程,它有若干个选项,可以控制它所等待的子进程;

waitpid提供了wait函数没有的三个功能:

(1) waitpid可以等待一个特定的进程,而wait则返回任一终止子进程的状态;

(2) waitpid提供了一个wait的非阻塞版本。有时用户希望获取一个子进程的状态,但不想阻塞;

(3) waitpid支持作业控制;

3. SIGCHLD信号处理多个子进程:

正确做法:

 void sig_child(int signo)
{
pid_t pid;
int stat; while ((pid = waitpid(-, &stat, WNOHANG)) > )
printf("child %d terminated\n", pid);
return;
}

在多个子进程可能同时终止的时候,同时产生多个SIGCHLD信号,因为信号不排队,所以信号处理函数可能只被调用一次,从而有多个子进程没有wait成为僵尸进程;

所以我们需要在产生信号的时候,对所有结束的子进程进行回收,于是使用while循环;

wait不能使用在while中,因为wait是阻塞的,比如当某子进程一直不停止,它将一直阻塞,从而影响了父进程;

于是使用waitpid,options设置为WNOHANG,可以在非阻塞情况下处理多个退出子进程;

wait与waitpid的更多相关文章

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

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

  2. linux下使用fork,exec,waitpid模拟system函数

    代码如下: #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include &l ...

  3. 详解wait和waitpid函数

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

  4. 父进程等待子进程结束 waitpid wait

    我们一直在强调一个概念就是进程是一个程序执行的实例,是内核在虚拟概念下创建的实体,它实例化的体现在用户态就是程序代码和代码使用的变量(存储空间),在内核态就是内核为我们每个进程所保存的数据结构(状态信 ...

  5. 系统调用wait、waitpid和exec函数

    本文介绍了Linux下的进程的一些概念,并着重讲解了与Linux进程管理相关的重要系统调用wait,waitpid和exec函数族,辅助一些例程说明了它们的特点和使用方法. 1.7 背景 在前面的文章 ...

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

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

  7. 对while((pid = waitpid(-1, &stat, WNOHANG)) > 0)不懂的地方,现在懂了

    while((pid = waitpid(-1, &stat, WNOHANG)) > 0) 需要写到信号处理函数中,假如有10个子进程 只要父进程能够收到最后一个信号,就能把前面丢失的 ...

  8. wait、waitpid 僵尸进程 孤儿进程

    man wait: NAME wait, waitpid, waitid - wait for process to change state SYNOPSIS #include <sys/ty ...

  9. 进程控制之wait和waitpid函数

    当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号.因为子进程终止是个异步事件(这可以在父进程运行的任何时候发生),所以这种信号也是内核向父进程发的异步通知.父进程可以选择忽略该信号, ...

  10. 【转】linux : waitpid函数

    原文网址:http://blog.csdn.net/jifengszf/article/details/3067841 [waitpid系统调用]       功能描述: 等待进程改变其状态.所有下面 ...

随机推荐

  1. 为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

    B-树由来 定义:B-树是一类树,包括B-树.B+树.B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点.B-树是专门为外部存储器设计的,如磁盘,它对 ...

  2. 网页中NPIO对Excel的操作实例

    上一节是在wpf中实现对excel的操作方法,这一节看看网页中如何封装实现对excel的上传导入和下载保存的. 看看效果图:

  3. Shell编程学习总结

    Shell编程总结 一.Hello World 新建文件test.sh 然后编辑代码: #!bin/bash/ echo “hello world !” cd 到目标目录下: chmod +x ./t ...

  4. 【刷题】BZOJ 1002 [FJOI2007]轮状病毒

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...

  5. P2805 [NOI2009]植物大战僵尸(最小割+拓扑排序)

    题意: n*m的矩阵,每个位置都有一个植物.每个植物都有一个价值(可以为负),以及一些它可以攻击的位置.从每行的最右面开始放置僵尸,僵尸从右往左行动,当僵尸在植物攻击范围内时会立刻死亡.僵尸每到一个位 ...

  6. 用Docker搭建Nexus私服

    搜索Nexus 在docker容器中加载Nexus镜像 发布本地项目到Nexus私服 配置连接方式 发布指令 打源码包上传插件 搜索Nexus   在我们打算使用Nexus时,我们先搜索一下docke ...

  7. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...

  8. BZOJ4873:[SHOI2017]寿司餐厅——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 https://www.luogu.org/problemnew/show/P3749 简要题 ...

  9. LibreOJ #6220. sum(数论+构造)

    题目大意:在数组中找出一些数,使它们的和能被n整除 这题标签是数学,那我就标题就写数论好了... 显然如果数组中有n的倍数直接取就行. 那假设数组中没有n的倍数,把数组中的数求前缀和后全部%n,会得到 ...

  10. 在局域网中基于Windows文件共享的git环境搭建

    本文的思想是在局域网中用一台电脑作为服务器,在其中建立一个文件夹,作为总的公开版本库.然后将这个文件夹共享,使其他客户机都可以访问,从而进行代码的管理. 一.下载安装文件 1.git核心: git-f ...