wait和waitpid
时间: 2025-01-21 20:23:11 浏览: 39
### 比较 `wait` 和 `waitpid` 系统调用
#### 功能描述
在Unix/Linux操作系统中,进程可以通过创建子进程来执行其他程序或任务。父进程通常需要等待这些子进程完成工作并获取其退出状态。为此,提供了两个主要函数:`wait()`和`waitpid()`。
对于`wait()`而言,该函数会挂起当前进程直到任意一个子进程终止,并返回已结束的子进程ID以及它的退出码等信息[^1]。然而,在多线程或多子进程中,这可能不是最理想的解决方案,因为无法指定要等待哪个特定的孩子。
相比之下,`waitpid(pid_t pid,int *status,int options)`则更加灵活。通过设置参数`pid`可以精确控制想要监视哪一个孩子;如果传入负数,则表示属于同一个组内的所有成员;而当传递零时意味着仅限于同一支前台作业中的任何后代。此外,还可以利用选项标志进一步定制行为模式,比如不暂停调用者即使没有立即可用的状态(`WNOHANG`)或是报告被信号停止而非仅仅死亡的情况(`WUNTRACED`)[^2]。
#### 使用示例
以下是两种方法的具体应用实例:
##### 使用 `wait`
```c
#include <sys/types.h>
#include <unistd.h>
// 创建新进程...
if (fork() == 0){
// 子进程代码块
}else{
// 父进程在此处阻塞直至某个子进程结束
wait(NULL);
}
```
##### 使用 `waitpid`
```c
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t child_pid;
switch(child_pid=fork()){
case -1:// 错误处理
perror("Fork failed");
exit(EXIT_FAILURE);
case 0 :// 子进程逻辑
printf("Child Process\n");
sleep(5); //模拟耗时操作
_exit(EXIT_SUCCESS);
default :
int status;
// 明确指出只关心刚刚启动的那个子进程的结果
if(waitpid(child_pid,&status,0)>0){
if(WIFEXITED(status)){
printf("Child exited with code %d.\n", WEXITSTATUS(status));
}
}
}
return 0;
}
```
阅读全文
相关推荐



















