面试题答案
一键面试signal
函数
- 函数原型:
void (*signal(int signum, void (*handler)(int)))(int);
- 功能:设置某一信号的处理方式。
signum
为信号编号,handler
可以是SIG_IGN
(忽略信号)、SIG_DFL
(恢复默认处理)或者是一个信号处理函数指针。 - 适用场景:简单的信号处理场景,例如想要忽略
SIGINT
(通常由Ctrl+C
产生)信号,代码如下:
#include <stdio.h>
#include <signal.h>
void ignore_signal(int signum) {
// 信号处理函数,这里为空,因为只是忽略信号
}
int main() {
signal(SIGINT, ignore_signal);
while (1) {
// 程序主循环
}
return 0;
}
sigaction
函数
- 函数原型:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
- 功能:检查或修改与指定信号相关联的处理动作。
signum
是信号编号,act
指向一个struct sigaction
结构体,用于指定新的信号处理动作,oldact
指向一个struct sigaction
结构体,用于保存旧的信号处理动作。 - 适用场景:更复杂的信号处理需求,例如希望在处理信号时能够屏蔽其他信号,或者获取信号的一些附加信息。如下是一个处理
SIGTERM
信号,并在处理时屏蔽SIGINT
信号的示例:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void handle_sigterm(int signum, siginfo_t *info, void *context) {
printf("Received SIGTERM, signum: %d, si_pid: %d\n", signum, info->si_pid);
}
int main() {
struct sigaction sa;
sa.sa_sigaction = handle_sigterm;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGINT);
sa.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &sa, NULL);
while (1) {
sleep(1);
}
return 0;
}
在这个例子中,sigaction
函数设置了 SIGTERM
信号的处理函数 handle_sigterm
,并且在处理 SIGTERM
信号时屏蔽了 SIGINT
信号,同时使用 SA_SIGINFO
标志来获取信号的附加信息。