MST

星途 面试题库

面试题:C语言中如何捕获SIGINT信号

在Linux环境下使用C语言编程,要求编写一段代码实现捕获SIGINT信号(通常由Ctrl+C产生),并在捕获到该信号时输出一条自定义的提示信息,简要说明信号处理函数的作用及关键函数的使用。
19.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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

// 信号处理函数
void sigint_handler(int signum) {
    printf("捕获到SIGINT信号,程序即将退出。\n");
    // 在此处可以进行一些清理工作
}

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

    printf("程序运行中,按Ctrl+C发送SIGINT信号...\n");
    while (1) {
        sleep(1);
    }

    return 0;
}

信号处理函数的作用

信号处理函数sigint_handler用于在程序捕获到指定信号(此处为SIGINT)时执行特定的操作。在这个函数中,我们输出了一条自定义的提示信息,同时也可以在这个函数中进行资源清理、保存数据等操作,确保程序在收到信号时能够安全、有序地处理,而不是直接异常终止。

关键函数的使用

  1. signal函数

    • 作用:用于注册信号处理函数。
    • 原型void (*signal(int signum, void (*handler)(int)))(int);
    • 参数
      • signum:要捕获的信号,如SIGINT
      • handler:信号处理函数的指针,这里为sigint_handler。如果设置为SIG_IGN,表示忽略该信号;如果设置为SIG_DFL,表示恢复默认处理方式。
    • 返回值:成功时返回之前的信号处理函数指针,失败时返回SIG_ERR,并设置errno
  2. sleep函数

    • 作用:使调用进程挂起一段时间。
    • 原型unsigned int sleep(unsigned int seconds);
    • 参数:指定挂起的秒数。
    • 返回值:如果剩余时间为0,返回0;如果被信号中断,返回剩余的秒数。在上述代码中,sleep(1)用于让主程序持续运行,以便等待信号的到来。