wait()
是 Linux 系统中的一个系统调用,主要用于父进程等待其子进程的结束。这个调用会暂停当前进程的执行,直到其子进程之一退出,或者接收到指定的信号为止。
wait()
函数定义在 <sys/wait.h>
头文件中,它的原型如下:
pid_t wait(int *status);
status
是一个指向整数的指针,用于存储子进程的退出状态。wait()
系统调用回收子进程的资源,避免产生僵尸进程。wait()
有几种变体,包括 wait()
, waitpid()
, 和 wait3()
/wait4()
。
wait()
:等待任意一个子进程结束。waitpid(pid_t pid, int *status, int options)
:可以指定等待特定的子进程,或者设置等待选项。wait3()
和 wait4()
:除了状态和 PID,还可以获取子进程的资源使用情况。以下是一个简单的 wait()
使用示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t child_pid;
// 创建子进程
child_pid = fork();
if (child_pid == 0) { // 子进程
printf("Child process: PID = %d\n", getpid());
exit(0); // 子进程退出
} else if (child_pid > 0) { // 父进程
int status;
wait(&status); // 等待子进程结束
printf("Parent process: Child with PID %d has finished.\n", child_pid);
if (WIFEXITED(status)) {
printf("Child process exited with status %d\n", WEXITSTATUS(status));
}
} else { // fork失败
perror("fork");
exit(EXIT_FAILURE);
}
return 0;
}
问题:调用 wait()
后,父进程一直阻塞,没有返回。
原因:
wait()
。解决方法:
wait()
前已经成功创建了子进程。waitpid()
并设置 WNOHANG
选项,这样如果没有子进程退出,waitpid()
会立即返回而不是阻塞。pid_t result = waitpid(-1, &status, WNOHANG);
if (result == 0) {
// 没有子进程退出
} else if (result < 0) {
// 错误处理
}
通过以上方法,可以有效地管理和同步父子进程,同时避免僵尸进程的产生。
领取专属 10元无门槛券
手把手带您无忧上云