面试题答案
一键面试在Linux环境下,使用C语言编程时,信号处理函数通常只有一个int
类型的参数,表示接收到的信号编号。若要传递额外的整数参数,可以借助全局变量或者使用sigaction
函数的sa_sigaction
字段,并配合sigval
结构体来实现。
- 使用全局变量方式:
- 定义一个全局变量来传递参数。
- 在信号处理函数中使用这个全局变量。
#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;
}
- 使用
sa_sigaction
和sigval
结构体方式:- 使用
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;
}
上述两种方法都可以实现向信号处理函数传递整数参数的功能,第一种方法简单直接,但可能在多线程等复杂环境下存在数据竞争问题;第二种方法更适合复杂场景,能安全地传递参数。