MST

星途 面试题库

面试题:C语言中Linux信号屏蔽基础应用

在Linux环境下使用C语言编程,假设你有一个程序可能会收到SIGINT信号(通常由Ctrl+C触发),请描述如何使用信号屏蔽机制暂时阻止程序响应SIGINT信号,并且说明在何时解除屏蔽比较合适,同时写出关键的代码片段。
24.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 使用信号屏蔽机制暂时阻止程序响应SIGINT信号
    • 在C语言中,可以使用sigprocmask函数来设置信号屏蔽字。
    • 首先,需要定义一个sigset_t类型的变量来表示信号集。然后,使用sigemptyset函数初始化这个信号集为空,再使用sigaddset函数将SIGINT信号添加到信号集中。最后,调用sigprocmask函数来设置信号屏蔽字,阻止SIGINT信号。
  2. 何时解除屏蔽比较合适
    • 当程序处于一个不能被SIGINT信号打断的关键操作阶段(例如正在进行文件系统操作、数据库事务处理等),需要暂时屏蔽SIGINT信号。在关键操作完成后,应该尽快解除屏蔽,恢复程序对SIGINT信号的正常响应,以保证程序的交互性和可终止性。
  3. 关键代码片段
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    sigset_t set;
    // 初始化信号集为空
    sigemptyset(&set);
    // 将SIGINT信号添加到信号集中
    sigaddset(&set, SIGINT);

    // 暂时阻止SIGINT信号
    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // 这里进行关键操作
    printf("关键操作正在进行,SIGINT信号已被屏蔽...\n");
    sleep(5);

    // 解除对SIGINT信号的屏蔽
    if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    printf("关键操作完成,SIGINT信号已解除屏蔽。\n");

    return 0;
}