wait,waitpid,waitid————等待进程改变状态

linux中子进程结束时,如果没有调用wait系列的函数时会变成僵死状态。内核会维持僵死进程的部分信息(PID,结束状态,资源利用信息),用于父进程随后获取子进程的信息。如果调用父进程终止,处于僵死状态的子进程将被丢弃(init()——自动调用wait)。
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *stauts);
pid_t waitpid(pid_t pid,int*stauts,int options);

这些系统调用用于获取子进程状态变化和状态信息。状态的变化可以认为是:(1)子进程终止;(2)子进程被信号中止;子进程被信号唤醒。

当子进程状态变化时,这些系统j调用立即返回。否则将阻塞直到子进程状态改变或信号处理程序(signal handler)中止子进程。

wait()系统调用将阻塞进程直到有子进程终止。wait(&status)等价于:

waitpid(-1,&status,0);

waitpid()系统调用将阻塞进程直到指定的子进程状态改变。默认情况下,waitpid()阻塞到子进程终止,但是可以通过第三个参数options改变等待目标。

第一个参数pid:

<-1      表示等待的子进程组号为pid绝对值。

-1        表示等待任何子进程。

0         表示等待进程组号等于调用进程的任何子进程。

>0      表示等待进程号为pid的子进程。

options的值可以是0也可以是下面的常量:

WNOHANG     若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。

WUNTRACED    子进程中止时也返回

WCONTINUED  中止子进程被SIGCONT唤醒时也返回

子进程结束后,状态信息被存放在第二个参数status,这是一个int型指针,可以通过下面宏对结果判别:

WIFEXITED(status)   如果子进程正常终止返回的状态为真。

WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。

WIFSIGNALED(status)如果子进程被信号终止返回的状态为真。

WTERMSIG(status)返回造成子进程终止的信号值,需要在WIFSIGNALED返回值为真的情况下才能使用。

WCOREDUMP(status)如果子进程产生核心转存返回真,这也需要WIFSIGNALED返回值为真时才能使用。并不是所有的UNIX系统都实现了这个宏,使用时需要配合

#ifdef WCOREDUMP

...

#endif

WIFSTOPPED(status)如果子进程没有终止,但停止了并可以重新执行时,该宏返回真。这种情况仅出现在waitpid调用中使用了WUNTRACED选项。

WSTOPSIG(status)如果WIFSTOPPED(status)返回真,该宏返回导致子进程停止的信号(signal)值。


waitid():

waitid()系统调用用于获取更精细的子进程状态的变化信息,执行成功或者指定了WNOHANG,但是id所指的子进程状态没有发生改变时返回0;出错返回-1。

int waitid(idtype_t idtype,id_t id,siginfo_t*infop,int options);
idtype和id指定等待的子进程或多个子进程,如下:

idtype=P_PID:等待指定进程号的子进程。

idtype=P_PGID:等待指定进程组号的所有子进程。

idtype==P_ALL:等待所有子进程。

options的值可以为如下几个的或操作组合:

  • WEXITED:等待那些已经终止的子进程
  • WSTOPPED:等待那些被信号暂停的子进程
  • WCONTINUED:等待那些由SIGCONT重新启动的子进程
  • WNOHANG:同wiatpid中的
  • WNOWAIT:从处于”可等待状态“的子进程返回,但是后面的wait还可以获取子进程的状态

如果infop不为NULL,则档waitid成功返回时,这个结构将会被填写,我们可以从该结构中获取我们感兴趣的信息,其中有:

  • si_pid: 子进程的进程id
  • si_uid:子进程的真实用户id
  • si_signo:总是设置为SIGCHID
  • si_status:要么是子进程的返回状态,要么是造成子进程状态改变的信号,si_code说明如何来解释这个域


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值