MST
星途 面试题库

面试题:C语言中Linux信号处理机制基础

在Linux环境下使用C语言,简述信号的基本概念以及如何使用`signal`函数来捕获并处理SIGINT信号(通常由Ctrl+C触发),请给出简单示例代码。
46.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

信号基本概念

信号是在软件层次上对中断机制的一种模拟,是一种异步通知机制。进程在运行过程中,可能会收到各种信号,这些信号通知进程发生了某种特定事件。例如,用户按下Ctrl+C会产生SIGINT信号,通知前台进程终止运行。信号可以由内核、其他进程或者进程自身产生,进程接收到信号后,会根据其当前的信号处理方式进行响应,处理方式一般有三种:忽略该信号、采用默认处理动作、自定义处理函数。

使用signal函数捕获并处理SIGINT信号

signal函数用于设置一个信号的处理方式,其原型为:

#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
  • signum:指定要处理的信号编号,例如SIGINT。
  • handler:处理函数的指针,或者是SIG_IGN(忽略信号),或者是SIG_DFL(采用默认处理动作)。

示例代码

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

// 信号处理函数
void sigint_handler(int signum) {
    printf("Received SIGINT signal. Exiting gracefully...\n");
    // 在此处添加清理或其他处理逻辑
    _exit(0);
}

int main() {
    // 设置SIGINT信号的处理函数
    if (signal(SIGINT, sigint_handler) == SIG_ERR) {
        perror("signal");
        return 1;
    }

    printf("Running... Press Ctrl+C to exit.\n");
    while (1) {
        sleep(1);
    }

    return 0;
}

在上述代码中:

  1. 定义了sigint_handler函数,当接收到SIGINT信号时,该函数会被调用,打印一条提示信息并退出程序。
  2. main函数中,使用signal函数将SIGINT信号的处理函数设置为sigint_handler。如果设置失败,signal函数会返回SIG_ERR并设置errno
  3. 主程序进入一个无限循环,每秒休眠一次,等待信号的到来。当用户按下Ctrl+C时,会触发SIGINT信号,调用sigint_handler函数进行处理。