📅  最后修改于: 2023-12-03 15:05:54.238000             🧑  作者: Mango
在Linux系统中,waitpid函数可以让父进程等待子进程的状态改变,以便取得子进程的退出状态。本文将介绍waitpid函数的使法。
waitpid函数定义在<sys/wait.h>
头文件中,其原型如下:
pid_t waitpid(pid_t pid, int *status, int options);
其中,pid
表示被等待的子进程pid,status
表示子进程的退出状态,options
表示附加的选项。如果子进程的状态没有发生改变,则waitpid
函数会一直等待,直到子进程的状态发生改变。
接下来,我们来看一个waitpid的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid;
int status;
pid = fork(); // 创建新进程
if (pid < 0) {
printf("fork error\n");
return -1;
} else if (pid == 0) { // 在子进程中执行
printf("This is child process, pid is %d\n", getpid());
sleep(3);
printf("child process exit\n");
exit(0);
} else { // 在父进程中执行
printf("This is parent process, pid is %d\n", getpid());
waitpid(pid, &status, 0);
if (WIFEXITED(status)) { // 子进程正常退出
printf("child process exit with %d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) { // 子进程被信号终止
printf("child process was killed by signal %d\n", WTERMSIG(status));
}
}
return 0;
}
首先,我们在main
函数中调用fork
函数创建一个新的子进程。
如果fork
执行失败,我们在父进程中输出错误信息并返回。
如果fork
执行成功,我们就可以分别在父进程和子进程中执行不同的代码。
在子进程中,我们输出子进程的pid,并使子进程休眠3秒后退出。注意,我们在子进程中调用了exit
函数来正常终止进程。
回到父进程中,我们使用waitpid
函数等待子进程的退出状态。这里的options
参数为0,表示我们使用默认的选项。
如果子进程正常退出,WIFEXITED(status)
宏将会返回true
,我们可以使用WEXITSTATUS(status)
宏获取子进程的退出状态。
如果子进程被信号终止,WIFSIGNALED(status)
宏将会返回true
,我们可以使用WTERMSIG(status)
宏获取终止子进程的信号编号。
最后,我们在父进程中输出相应的消息,然后退出程序。
需要注意的是,waitpid函数返回子进程的进程pid,如果该进程是正常退出的,返回值等于子进程的进程pid;如果该进程被中断了,返回值等于-1。
因此,当调用waitpid函数后,需要检查返回值是否等于子进程的pid,以确认是否获取到了子进程的退出状态。如果返回值等于子进程的pid,可以使用宏函数处理状态信息;如果返回值等于-1,则说明出错了,需要检查errno。