wait()函数可以获取子进程的退出状态。当父进程调用 wait() 时,它会阻塞,直到其中一个子进程终止。此时,终止的子进程的退出状态会被返回给父进程,父进程可以通过提供的状态参数来检查子进程是正常退出还是异常终止。
1.头文件
#include <sys/types.h>
#include <sys/wait.h>
2.函数原型
pid_t wait(int *wstatus);
3.参数
wstatus:指向整数的指针,用于存储子进程的退出状态信息。如果不关心子进程的状态,可以为 NULL。
相关退出状态的宏定义简要说明:
WIFEXITED(status):检查子进程是否正常结束,如果是,返回非零值。
WEXITSTATUS(status):在子进程正常结束的情况下,获取其退出码。
WIFSIGNALED(status):检查子进程是否因信号终止,如果是,返回非零值。
WTERMSIG(status):在子进程因信号终止的情况下,获取终止它的信号代码。
WIFSTOPPED(status):检查子进程是否被暂停,如果是,返回非零值。
WSTOPSIG(status):在子进程被暂停的情况下,获取导致它暂停的信号代码。
在早期的 C 语言库或系统调用设计中,很多函数使用了通用名称(如 status)作为变量或参数名称。但随着库的扩展和代码的复杂性增加,系统调用设计倾向于使用更有意义的变量名称,wstatus 就是其中之一,用以避免与其他函数或变量命名冲突。wstatus 表示 wait status,明确表明这个参数的作用是用于接收子进程的退出状态。
4.返回值
返回终止的子进程的进程 ID。如果没有子进程则返回 -1,并设置 errno。
5.示例:使用wait()函数等待回收进程资源
| #include <stdio.h>
#include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { pid_t pid = fork(); // 创建子进程 if (pid < 0) { perror("fork failed"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程 printf("Child process (PID: %d) is running...\n", getpid()); sleep(2); // 模拟一些工作 exit(42); // 子进程返回退出码42 } else { // 父进程 int status; pid_t result = wait(&status); // 等待子进程结束 if (result == -1) { perror("wait failed"); exit(EXIT_FAILURE); } printf("Child process (PID: %d) terminated.\n", result); if (WIFEXITED(status)) { printf("Child exited with status %d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("Child killed by signal %d\n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("Child stopped by signal %d\n", WSTOPSIG(status)); } else { printf("Child terminated abnormally\n"); } } return 0; } |
6.运行结果
| Child process (PID: 200823) is running...
Child process (PID: 200823) terminated. Child exited with status 42 |
7.代码解析
通过fork()创建一个子进程,在子进程中模拟了一些工作(使用 sleep),然后正常退出并返回退出码 42。父进程中调用 wait(&status),等待子进程结束并获取其退出状态。检查 wait 的返回值,如果为 -1,则表示出错。使用 WIFEXITED(status)、WEXITSTATUS(status) 等宏检查子进程的退出状态并打印相关信息。
8.注意点
wait()函数通常和fork()函数配套使用,因为如果进程调用wait()函数的时候没有子进程,wait()函数会报错并返回-1;如果在调用wait()函数时子进程已经结束,则会立即返回子进程结束状态值。子进程的结束状态信息会由参数wstatus返回,与此同时该函数会返子进程的PID, 它通常是已经结束运行的子进程的PID。
258