wait和waitpid函数

当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。父进程可以忽略该信号,或调用信号处理函数。调用wait或waitpid的进程,会发生以下情况:

1).如果其所有子进程都在运行,则该进程阻塞

2).如果一个子进程已经终止,正等待父进程获取其终止状态,则取得该进程的终止状态立即返回

3).如果它没有任何子进程,则立即出错返回。

#include <sys/wait.h>

#pid_t wait (int * statloc);

#pid_t waitpid (pid_t pid, int * statloc, int optins);

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

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

3).对于wait,其唯一的出错是调用进程没有子进程;对于waitpid,假如指定的进程或进程组不存在,或者参数pid指定的进程不是调用进程的子进程都可能出错。

4).Waitpid提供了wait没有的三个功能:一是waitpid可等待一个特定的进程;二是waitpid提供了一个waitpid的非阻塞版本;三是waitpid支持作业控制。  

     依据传统,这两个函数返回的整型状态字是由实现定义的。其中某些位表示退出状态(正常返回),其它位表示信号编号(异常返回)。下面有。

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

WIFSIGNALED(status)
若为异常终止子进程返回的状态,则为真(接到一个不捕捉的信号)。对于这种情况可以执行WTERMSIG(status),取得子进程终止的信号编号。

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

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

pid ==-1            等待任一子进程。
pid >0 
            等待其进程ID与pid相等的子进程
pid ==0 
           等待其组ID等于调用进程组ID的任一的子进程
pid <-1 
            等待其组ID等于pid绝对值的任一的子进程

 

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

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

WUNTRACED
若实现支持作业控制,那么由pid指定的任一子进程已经处于暂停状态并没报告过,则返回其状态


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wzhwho/archive/2009/02/26/3940952.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值