多进程时父进程如何wait
时间: 2024-05-11 20:17:23 浏览: 23
当一个父进程创建了多个子进程时,可以使用 `wait()` 函数等待子进程结束并返回子进程的状态。如果父进程只等待一个子进程,可以使用 `waitpid()` 函数。这两个函数都是阻塞函数,即调用它们的进程会被挂起,直到有一个子进程结束。
在 `wait()` 函数中,如果父进程有多个子进程,可以使用循环来等待所有子进程结束,例如:
```
for (int i = 0; i < num_children; i++) {
int status;
pid_t child_pid = wait(&status);
printf("Child process %d exited with status %d\n", child_pid, status);
}
```
在 `waitpid()` 函数中,可以指定等待哪个子进程结束,例如:
```
pid_t child_pid = fork();
if (child_pid == 0) {
// 子进程代码
} else if (child_pid > 0) {
// 父进程代码
int status;
waitpid(child_pid, &status, 0);
printf("Child process %d exited with status %d\n", child_pid, status);
} else {
// fork() 函数调用失败
}
```
需要注意的是,如果子进程在调用 `exec()` 函数族之后没有调用 `_exit()` 或 `exit()` 函数,父进程在调用 `wait()` 或 `waitpid()` 函数时会一直阻塞,因为子进程的状态一直没有改变。这种情况下可以使用 `WNOHANG` 选项,让 `waitpid()` 函数在没有子进程退出时立即返回。例如:
```
pid_t child_pid = fork();
if (child_pid == 0) {
// 子进程代码
} else if (child_pid > 0) {
// 父进程代码
int status;
while (waitpid(child_pid, &status, WNOHANG) == 0) {
// 没有子进程退出,继续等待
// 可以执行一些其他操作
}
printf("Child process %d exited with status %d\n", child_pid, status);
} else {
// fork() 函数调用失败
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)