当前位置:嗨网首页>书籍在线阅读

18-等待子进程的其他方法

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.5.2 等待子进程的其他方法

对于某些应用,它们希望有更多等待子进程的方式。XSI扩展了POSIX,而Linux提供了waitid():

222.png 和wait()、waitpid()一样, waitid()是用于等待子进程结束并获取其状态变化(终止、停止或者继续运行)的信息。waitid()提供了更多的选项,但是其代价是复杂性变高。

类似于waitpid(),waitid()支持开发人员指定等待哪个子进程,但waitid()需要两个参数,而不是一个。参数idtype和id用来指定要等待哪个子进程,和waitpid()中的pid参数的作用一样。idtype的值是下面三个中的一个:

P_PID 等待pid值是id的子进程。

P_GID 等待进程组ID是id的那些子进程。

P_ALL 等待所有子进程,参数id被忽略。

参数id的类型是id_t,这个类型很少见,它代表着一种通用的ID号。由于将来可能会增加idtype值,所以引入这个类型,这样新加入的idtype值也可以很容易表示。id_t类型足够大,可以保证能够存储任何类型的pid_t值。在Linux上,开发人员可以把它当作pid_t来用——比如直接把pid_t值或数值常量传递给id_t。然而,有经验的程序员不关心类型转换。

参数options是以下一个或者多个选项值进行二进制“或”运算的结果:

WEXITED 调用进程会等待结束的子进程(由id和idtyp指定)。

WSTOPPED 调用进程会等待因收到信号而停止执行的子进程。

WCONTINUED 调用进程会等待因收到信号而继续执行的子进程。

WNOHANG 调用进程不会阻塞,如果没有子进程结束(停止或继续执行),它就会立即返回。

WNOWAIT 调用进程不会删除相应子进程的僵尸状态。在将来可能会继续等待处理僵尸进程。

成功时,waitid()会填充参数infop,infop指向一个合法的siginfo_t类型。siginfo_t结构体的具体成员变量是与实现相关的[4],但是在调用waitpid()之后,有一些成员变量就生效了。也就是说,一次成功的调用可以保证下面的成员会被赋值:

si_pid 子进程的pid。

si_uid 子进程的uid。

si_code 根据子进程的状态是终止、被信号所杀死、停止或者继续执行而分别设置为CLD_EXITED、CLD_KILLED、CLD_STOPPED或CLD_CONTINUED。

si_signo 设置为SIGCHLD。

si_status 如果si_code是CLD_EXITED,该变量是子进程的退出值。否则,该变量是导致状态改变的那个信号编码。

当成功时,waitid()返回0。出错时,返回-1。errno会被设置成下列值之一:

ECHLD 由id和idtype确定的进程不存在。

EINTR 在options里没有设置WNOHANG,而且一个信号打断了子进程的执行。

EINVAL options参数不合法,或者id和idtyp的组合不合法。

和wait()、waitpid()相比,waitid()提供了更多有用的语义功能。特别地,从结构体siginfo_t获取的信息可能是很有用的。如果不需要这些信息,那么就应该选择更简单的函数,这样可以被更多的系统所支持,并且更容易被移植到更多的非Linux系统上。