MST

星途 面试题库

面试题:C语言中Linux信号处理里信号恢复的基本实现

在Linux环境下,使用C语言编写一个简单程序,当接收到SIGINT信号(通常由Ctrl+C产生)时,输出一条提示信息,并且在信号处理函数执行完毕后恢复到信号处理前的执行状态,简要说明信号恢复的原理。
50.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void sigint_handler(int signum) {
    printf("Received SIGINT signal.\n");
}

int main() {
    struct sigaction sa;

    sa.sa_handler = sigint_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART;

    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    while (1) {
        printf("Running...\n");
        sleep(1);
    }

    return 0;
}

信号恢复原理

  1. SA_RESTART标志:在设置信号处理函数时,通过sa.sa_flags = SA_RESTART设置了该标志。当程序接收到信号并执行信号处理函数后,若该信号中断了某些系统调用(如readwriteaccept等),SA_RESTART标志会使得这些被中断的系统调用自动重新启动,而不是返回错误(通常返回-1并设置errnoEINTR),从而恢复到信号处理前的执行状态。
  2. 信号掩码:在信号处理函数执行期间,系统会自动将该信号加入到进程的信号掩码中,防止在处理该信号时再次接收到相同信号导致递归处理。处理函数执行完毕后,信号掩码会恢复到之前的状态,进程继续正常运行,就像信号未发生一样(除了执行了信号处理函数)。