对于许多需要创建子进程的应用来说,父进程能够监测子进程的终止时间和过程是很有必要的,wait 以及相关系统调用函数提供了这一功能
1 |
|
系统调用 wait 执行如下动作:
可以这样来等待调用进程的所有子进程终止:
1 |
while((childid = wait(NULL)) != -1) |
系统调用 wait 存在诸多限制,而 waitpid 则突破了这些限制:
1 |
|
status 与 wait 中的意义相同。参数 pid 用来表示需要等待的具体子进程:
参数 options 是一个位掩码,可以包含 0 个或多个标志:
WUNTRACED:除了返回终止子进程的信息外,还返回因信号而停止的子进程信息。
WCONTINUED:返回那些因收到 SIGCONT 信号而恢复执行的已停止子进程的状态信息。
WNOHANG:如果参数 pid 所指定的子进程并未发生状态变化,则立即返回不会阻塞。这种情况下 waitpid 返回 0。
与 waitpid 类似,waitid 返回子进程的状态,不过 waitid 提供了 waitpid 所没有的扩展功能。
1 |
|
参数 idtype 和 id 指定需要等待哪些子进程:
注:与 waitpid 不同,不能靠指定 id 为 0 来表示与调用者属于同一进程租的所有进程,必须以 getpgrp 函数的返回值来显式指定调用者的进程组 id。
waitpid 与 waitid 最显著的区别在于,对于应该等待的子进程事件,waitid 可以更为精确的控制。可以通过在 options 中指定一个或多个标识来实现控制:
WEXITED :等待已终止的子进程,无论其是否正常返回。
WSTOPPED:等待已通过信号而停止的子进程。
WCONTINUED : 等待经由信号 SIGCONT 而恢复的子进程。
WNOHANG:如果匹配 id 值的子进程中无状态信息需要返回,则立即返回而不阻塞。
WNOWAIT:会返回子进程状态,但是子进程依然处于可等待状态,稍后可以再次等待并获取相同的信息。
执行成功返回 0,并更新指针 infop 所指向的 siginfo_t 结构,其包含子进程的相关信息。
wait3 和 wait4 函数执行与 waitpid 类似的工作,主要的语义差别在于,wait3 和 wait4 在参数 rusage 所指向的结构中返回终止子进程的资源使用情况。其中包括进程使用的 CPU 时间总量以及内存管理的统计数据。
1 |
|
除了对参数 rusage 的使用外,调用 wait3 等价于:waitpid(-1,&status,options);
类似的 wait4 等价于:waitpid(pid,&status,options);
也就是说,wait3 等待的是任意子进程,而 wait4 等待的是选定的一个或多个子进程。
但是其实 wait3 和 wait4 的返回值没什么价值,此外这两函数的移植性比较差。尽量不要用…
参考资料:
《linux/UNIX 系统编程手册 上》(tlpi)
《UNIX 环境高级编程 3th》(APUE)