面试题答案
一键面试在Linux环境下,虽然不能真正自定义新的信号类型,因为信号类型是由系统预先定义好的。不过可以使用系统预留的实时信号(从SIGRTMIN
到SIGRTMAX
)来实现类似自定义信号的功能。以下是具体步骤和代码示例:
- 定义信号处理函数:编写一个函数,当接收到信号时,该函数将在控制台打印特定信息。
- 注册信号处理函数:使用
signal
或sigaction
函数将定义的信号处理函数与选定的实时信号关联起来。
以下是示例代码:
#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_handler
与SIGRTMIN
信号关联起来。sigaction
函数的第一个参数是要处理的信号,第二个参数是struct sigaction
结构体,包含信号处理函数等信息,第三个参数用于保存之前的信号处理设置(这里设为NULL
)。 - 在
main
函数中,程序进入一个无限循环,保持运行状态,等待接收到自定义信号。
编译运行该程序后,可以使用kill -SIGRTMIN <pid>
命令向该程序发送自定义信号(将<pid>
替换为实际的进程ID),程序将在控制台打印出特定信息。