MST

星途 面试题库

面试题:C语言在Linux环境下等待指定子进程的常规方法

在Linux系统中,使用C语言编写一个程序,创建一个子进程。父进程需要等待指定的子进程(假设子进程的PID已知)结束,并获取子进程的退出状态。请描述关键函数及其使用方法,并给出核心代码示例。
48.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

关键函数及其使用方法

  1. fork()
    • 作用:用于创建一个新进程,即子进程。子进程是父进程的副本。
    • 用法:pid_t pid = fork();。返回值:在父进程中返回子进程的PID;在子进程中返回0;如果创建失败返回 -1。
  2. waitpid()
    • 作用:等待指定的子进程结束,并获取其退出状态。
    • 用法:pid_t waitpid(pid_t pid, int *status, int options);
      • pid:指定要等待的子进程的PID。如果pid为 -1,则等待任何子进程。
      • status:一个指向整数的指针,用于存储子进程的退出状态。可以使用宏如WIFEXITED(status)判断子进程是否正常退出,WEXITSTATUS(status)获取正常退出的状态值。
      • options:通常设为0,表示阻塞等待子进程结束。

核心代码示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid, wpid;
    int status;

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        return 1;
    } else if (pid == 0) {
        // 子进程代码
        printf("子进程 (PID: %d) 正在运行...\n", getpid());
        // 子进程执行一些操作后退出
        exit(42); 
    } else {
        // 父进程代码
        printf("父进程 (PID: %d) 等待子进程 (PID: %d) 结束...\n", getpid(), pid);
        // 等待指定的子进程结束
        wpid = waitpid(pid, &status, 0); 
        if (wpid == -1) {
            perror("waitpid");
            return 1;
        }
        if (WIFEXITED(status)) {
            printf("子进程正常退出,退出状态: %d\n", WEXITSTATUS(status));
        } else {
            printf("子进程异常退出\n");
        }
    }
    return 0;
}