MST

星途 面试题库

面试题:C语言在Linux环境下如何实现子进程等待的基础超时设置

在Linux系统中,使用C语言编写一个程序,创建一个子进程,父进程等待子进程结束,但设置一个5秒的超时时间。若子进程在5秒内结束,打印子进程的退出状态;若超时,打印提示信息表示等待超时。请描述实现思路并给出核心代码。
27.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用fork()函数创建子进程。
  2. 在父进程中使用alarm()函数设置5秒的定时器。
  3. 使用waitpid()函数等待子进程结束,waitpid()WNOHANG标志用于非阻塞等待。
  4. 处理SIGALRM信号,在信号处理函数中设置一个标志表示超时。
  5. 根据等待结果和超时标志打印相应信息。

核心代码

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

volatile sig_atomic_t timeout = 0;

void alarm_handler(int signum) {
    timeout = 1;
}

int main() {
    pid_t pid;
    int status;

    // 注册信号处理函数
    signal(SIGALRM, alarm_handler);

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // 子进程
        sleep(2); // 模拟子进程执行任务
        exit(EXIT_SUCCESS);
    } else {
        // 父进程
        alarm(5); // 设置5秒超时
        while (!timeout) {
            pid_t result = waitpid(pid, &status, WNOHANG);
            if (result == -1) {
                perror("waitpid");
                exit(EXIT_FAILURE);
            } else if (result == pid) {
                // 子进程正常结束
                alarm(0); // 取消定时器
                if (WIFEXITED(status)) {
                    printf("子进程退出状态: %d\n", WEXITSTATUS(status));
                }
                break;
            }
            sleep(1);
        }
        if (timeout) {
            printf("等待子进程超时\n");
        }
    }

    return 0;
}