实现思路
- 定义复杂结构体:首先定义包含多个不同类型成员的结构体。
- 信号处理函数:编写信号处理函数,该函数接收上述结构体指针作为参数。
- 线程处理:在多线程程序中,使用
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;
}