MST

星途 面试题库

面试题:C语言在Linux多线程场景下信号处理函数参数传递

在Linux系统中,使用C语言编写多线程程序,当一个线程接收到特定信号后,需要将一个复杂结构体(包含多个不同类型成员)作为参数传递给信号处理函数进行处理,详细阐述实现思路并给出代码框架。
16.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义复杂结构体:首先定义包含多个不同类型成员的结构体。
  2. 信号处理函数:编写信号处理函数,该函数接收上述结构体指针作为参数。
  3. 线程处理:在多线程程序中,使用pthread_sigmask函数设置线程掩码,使得特定信号能被指定线程接收。当线程接收到信号后,将结构体实例作为参数传递给信号处理函数。

代码框架

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>

// 定义复杂结构体
typedef struct {
    int int_member;
    double double_member;
    char char_member[100];
} ComplexStruct;

// 信号处理函数
void signal_handler(int signum, siginfo_t *info, void *context) {
    ComplexStruct *struct_ptr = (ComplexStruct *)info->si_value.sival_ptr;
    // 处理结构体数据
    printf("Received signal %d, int_member: %d, double_member: %lf, char_member: %s\n", signum, struct_ptr->int_member, struct_ptr->double_member, struct_ptr->char_member);
}

void* thread_function(void* arg) {
    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset, SIGUSR1);

    // 设置线程掩码
    if (pthread_sigmask(SIG_BLOCK, &sigset, NULL) != 0) {
        perror("pthread_sigmask");
        pthread_exit(NULL);
    }

    ComplexStruct my_struct = {1, 3.14, "Hello, Signal"};
    union sigval sv;
    sv.sival_ptr = &my_struct;

    siginfo_t si;
    si.si_signo = SIGUSR1;
    si.si_value = sv;

    // 发送信号给自己
    if (sigqueue(pthread_self(), SIGUSR1, si) != 0) {
        perror("sigqueue");
    }

    int signum;
    if (sigwait(&sigset, &signum) != 0) {
        perror("sigwait");
        pthread_exit(NULL);
    }

    pthread_exit(NULL);
}

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

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

    pthread_t thread;
    if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
        perror("pthread_create");
        return 1;
    }

    if (pthread_join(thread, NULL) != 0) {
        perror("pthread_join");
        return 1;
    }

    return 0;
}