C 语言中的 wait 函数
Jinku Hu
2023年10月12日
本文将演示关于如何使用 C 语言中的 wait
函数的多种方法。
在 C 语言中使用 wait
函数来等待子进程的状态变化
wait
函数是符合 POSIX 标准的系统调用的封装器,定义在 <sys/wait.h>
头文件中。该函数用于等待子进程的程序状态变化,并检索相应的信息。wait
通常在创建新子进程的 fork
系统调用之后调用。wait
调用会暂停调用程序,直到它的一个子进程终止。
用户应该将代码结构化,使调用进程和子进程有两条不同的路径。通常用 if...else
语句来实现,该语句评估 fork
函数调用的返回值。注意 fork
在父进程中返回子进程 ID,一个正整数,在子进程中返回 0。如果调用失败,fork
将返回-1。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t c_pid = fork();
if (c_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (c_pid == 0) {
printf("printed from child process %d", getpid());
exit(EXIT_SUCCESS);
} else {
printf("printed from parent process %d\n", getpid());
wait(NULL);
}
exit(EXIT_SUCCESS);
}
在 C 语言中使用 waitpid
函数来等待特定子进程的状态变化
waitpid
是 wait
函数的一个略微增强的版本,它提供了等待特定子进程和修改返回触发行为的功能。waitpid
除了子进程被终止的情况外,还可以返回子进程是否已经停止或继续。
在下面的例子中,我们从子进程调用 pause
函数,子进程进入睡眠状态,直到收到信号。另一方面,父进程调用 waitpid
函数,暂停执行,直到子进程返回。并利用宏 WIFEXITED
和 WIFSIGNALED
分别检查子进程是正常终止还是被信号终止,然后将相应的状态信息打印到控制台。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t child_pid, wtr;
int wstatus;
child_pid = fork();
if (child_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
printf("Child PID is %d\n", getpid());
pause();
_exit(EXIT_FAILURE);
} else {
wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
if (wtr == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(wstatus)) {
printf("exited, status=%d\n", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
printf("killed by signal %d\n", WTERMSIG(wstatus));
}
}
exit(EXIT_SUCCESS);
}
作者: Jinku Hu