在Linux系统中,可以使用signal函数来设置信号的处理方式,也就是指定某个信号被捕获时应该采取的行动。
解决方案1:使用signal函数
#include <stdio.h>
#include <signal.h>
void handler(int sig) {
write(1, "Caught signal ", 14);
write(1, sig == SIGINT ? "SIGINT\n" : "SIGQUIT\n", sig == SIGINT ? 7 : 8);
}
int main() {
signal(SIGINT, handler);
signal(SIGQUIT, handler);
while(1) pause();
return 0;
}
在这个例子中,我们定义了一个信号处理函数handler,当程序接收到SIGINT或SIGQUIT信号时,会调用这个函数。
解决方案2:使用sigaction函数
#include <stdio.h>
#include <signal.h>
void handler(int sig, siginfo_t *info, void *secret) {
write(1, "Caught signal ", 14);
write(1, sig == SIGINT ? "SIGINT\n" : "SIGQUIT\n", sig == SIGINT ? 7 : 8);
}
int main() {
struct sigaction sa;
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, NULL);
sigaction(SIGQUIT, &sa, NULL);
while(1) pause();
return 0;
}
在这个例子中,我们使用了sigaction函数来设置信号处理程序。这个函数提供了更多的选项,比如可以设置信号阻塞集合等。
注意:上述两种方法都不是线程安全的,如果在多线程程序中使用,可能会出现意想不到的结果。在多线程程序中,应该使用其他线程安全的信号处理方法,如sigqueue函数或者pthread\_sigmask函数。