MST
星途 面试题库

面试题:C语言中Linux信号处理的基本函数有哪些及使用场景

在Linux环境下使用C语言进行开发,简述信号处理常用的基本函数(如signal、sigaction等),并举例说明每个函数适用于什么样的信号处理场景。
20.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

signal 函数

  1. 函数原型void (*signal(int signum, void (*handler)(int)))(int);
  2. 功能:设置某一信号的处理方式。signum 为信号编号,handler 可以是 SIG_IGN(忽略信号)、SIG_DFL(恢复默认处理)或者是一个信号处理函数指针。
  3. 适用场景:简单的信号处理场景,例如想要忽略 SIGINT(通常由 Ctrl+C 产生)信号,代码如下:
#include <stdio.h>
#include <signal.h>

void ignore_signal(int signum) {
    // 信号处理函数,这里为空,因为只是忽略信号
}

int main() {
    signal(SIGINT, ignore_signal);
    while (1) {
        // 程序主循环
    }
    return 0;
}

sigaction 函数

  1. 函数原型int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
  2. 功能:检查或修改与指定信号相关联的处理动作。signum 是信号编号,act 指向一个 struct sigaction 结构体,用于指定新的信号处理动作,oldact 指向一个 struct sigaction 结构体,用于保存旧的信号处理动作。
  3. 适用场景:更复杂的信号处理需求,例如希望在处理信号时能够屏蔽其他信号,或者获取信号的一些附加信息。如下是一个处理 SIGTERM 信号,并在处理时屏蔽 SIGINT 信号的示例:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handle_sigterm(int signum, siginfo_t *info, void *context) {
    printf("Received SIGTERM, signum: %d, si_pid: %d\n", signum, info->si_pid);
}

int main() {
    struct sigaction sa;
    sa.sa_sigaction = handle_sigterm;
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGINT);
    sa.sa_flags = SA_SIGINFO;

    sigaction(SIGTERM, &sa, NULL);

    while (1) {
        sleep(1);
    }
    return 0;
}

在这个例子中,sigaction 函数设置了 SIGTERM 信号的处理函数 handle_sigterm,并且在处理 SIGTERM 信号时屏蔽了 SIGINT 信号,同时使用 SA_SIGINFO 标志来获取信号的附加信息。