📜  waitpid 的示例代码 (1)

📅  最后修改于: 2023-12-03 15:05:54.238000             🧑  作者: Mango

简介

在Linux系统中,waitpid函数可以让父进程等待子进程的状态改变,以便取得子进程的退出状态。本文将介绍waitpid函数的使法。

waitpid函数的原型

waitpid函数定义在<sys/wait.h>头文件中,其原型如下:

pid_t waitpid(pid_t pid, int *status, int options);

其中,pid表示被等待的子进程pid,status表示子进程的退出状态,options表示附加的选项。如果子进程的状态没有发生改变,则waitpid函数会一直等待,直到子进程的状态发生改变。

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。