MST

星途 面试题库

面试题:C语言中Linux C语言prefork模型的进程监控基础

在Linux C语言的prefork模型中,简述如何使用系统调用实现对已创建子进程的状态监控,例如监控子进程是否正常运行,并举例说明主要使用的系统调用函数及其参数。
40.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在Linux C语言的prefork模型中,可使用wait系列系统调用来监控已创建子进程的状态。

  1. wait函数

    • 函数原型#include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status);
    • 参数status是一个指向整数的指针,用于存储子进程退出时的状态信息。如果不关心子进程的退出状态,可以传入NULL
    • 功能:父进程调用wait函数会阻塞,直到任意一个子进程结束,然后wait返回已结束子进程的进程ID,并通过status参数获取子进程的退出状态。
  2. waitpid函数

    • 函数原型#include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid, int *status, int options);
    • 参数
      • pid:指定等待哪个子进程。pid > 0时,等待进程ID为pid的子进程;pid = -1时,等待任意子进程,功能类似waitpid = 0时,等待同组ID的任意子进程;pid < -1时,等待进程组ID等于pid绝对值的任意子进程。
      • status:和wait函数中的status类似,用于获取子进程的退出状态。
      • options:可设置为0,也可使用WNOHANG等选项。WNOHANG表示如果没有子进程退出,waitpid不阻塞,立即返回。

例如:

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

int main() {
    pid_t pid;
    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程
        printf("Child process is running, pid: %d\n", getpid());
        sleep(2);
        exit(EXIT_SUCCESS);
    } else {
        // 父进程
        int status;
        pid_t wpid = waitpid(pid, &status, 0);
        if (wpid == -1) {
            perror("waitpid");
            exit(EXIT_FAILURE);
        }
        if (WIFEXITED(status)) {
            printf("Child process %d exited normally, exit status: %d\n", wpid, WEXITSTATUS(status));
        } else if (WIFSIGNALED(status)) {
            printf("Child process %d was terminated by signal %d\n", wpid, WTERMSIG(status));
        }
    }
    return 0;
}

在上述代码中,父进程使用waitpid等待特定子进程结束,并通过status获取子进程的退出状态,判断子进程是正常退出还是被信号终止。