MST

星途 面试题库

面试题:C语言中Linux信号处理函数如何传递简单参数

在Linux环境下使用C语言编程,若信号处理函数需要传递一个整数参数,描述如何实现这种参数传递,给出关键代码示例。
26.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

在Linux环境下,使用C语言编程时,信号处理函数通常只有一个int类型的参数,表示接收到的信号编号。若要传递额外的整数参数,可以借助全局变量或者使用sigaction函数的sa_sigaction字段,并配合sigval结构体来实现。

  1. 使用全局变量方式
    • 定义一个全局变量来传递参数。
    • 在信号处理函数中使用这个全局变量。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

// 定义全局变量
int global_param;

// 信号处理函数
void signal_handler(int signum) {
    printf("Received signal %d, with parameter %d\n", signum, global_param);
}

int main() {
    struct sigaction sa;
    sa.sa_handler = signal_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

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

    // 设置全局变量的值
    global_param = 42;

    // 发送信号
    if (kill(getpid(), SIGUSR1) == -1) {
        perror("kill");
        return 1;
    }

    sleep(1); // 等待信号处理完成
    return 0;
}
  1. 使用sa_sigactionsigval结构体方式
    • 使用sigaction函数,设置sa_sigaction字段为信号处理函数。
    • 在发送信号时,通过sigqueue函数传递参数。
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/queue.h>

// 信号处理函数
void signal_handler(int signum, siginfo_t *info, void *context) {
    printf("Received signal %d, with parameter %d\n", signum, info->si_value.sival_int);
}

int main() {
    struct sigaction sa;
    sa.sa_sigaction = signal_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_SIGINFO;

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

    union sigval sv;
    sv.sival_int = 42;

    // 发送信号并传递参数
    if (sigqueue(getpid(), SIGUSR1, sv) == -1) {
        perror("sigqueue");
        return 1;
    }

    sleep(1); // 等待信号处理完成
    return 0;
}

上述两种方法都可以实现向信号处理函数传递整数参数的功能,第一种方法简单直接,但可能在多线程等复杂环境下存在数据竞争问题;第二种方法更适合复杂场景,能安全地传递参数。