MST

星途 面试题库

面试题:C语言中如何自定义一个Linux信号处理函数并关联到自定义信号类型

在Linux环境下使用C语言,假设系统已经有部分默认信号类型。请描述如何自定义一种新的信号类型,并编写一个信号处理函数与之关联,当接收到该自定义信号时,能在控制台打印出特定的信息。
47.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在Linux环境下,虽然不能真正自定义新的信号类型,因为信号类型是由系统预先定义好的。不过可以使用系统预留的实时信号(从SIGRTMINSIGRTMAX)来实现类似自定义信号的功能。以下是具体步骤和代码示例:

  1. 定义信号处理函数:编写一个函数,当接收到信号时,该函数将在控制台打印特定信息。
  2. 注册信号处理函数:使用signalsigaction函数将定义的信号处理函数与选定的实时信号关联起来。

以下是示例代码:

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

// 信号处理函数
void custom_signal_handler(int signum) {
    printf("Received custom signal %d. This is a custom message.\n", signum);
}

int main() {
    // 使用SIGRTMIN作为自定义信号
    int custom_signal = SIGRTMIN;

    // 注册信号处理函数
    struct sigaction sa;
    sa.sa_handler = custom_signal_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

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

    printf("Waiting for custom signal...\n");

    // 保持程序运行,等待信号
    while (1) {
        sleep(1);
    }

    return 0;
}

在上述代码中:

  • custom_signal_handler函数是自定义的信号处理函数,当接收到信号时,它会在控制台打印特定信息。
  • 使用sigaction函数将custom_signal_handlerSIGRTMIN信号关联起来。sigaction函数的第一个参数是要处理的信号,第二个参数是struct sigaction结构体,包含信号处理函数等信息,第三个参数用于保存之前的信号处理设置(这里设为NULL)。
  • main函数中,程序进入一个无限循环,保持运行状态,等待接收到自定义信号。

编译运行该程序后,可以使用kill -SIGRTMIN <pid>命令向该程序发送自定义信号(将<pid>替换为实际的进程ID),程序将在控制台打印出特定信息。