Linux信号的保存和处理
在Linux中,可以使用sigset_t
数据类型来保存信号集,并使用sigprocmask
和sigpending
函数来处理信号。以下是一个简单的例子,展示了如何保存和处理信号。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void handle_signal(int sig) {
// 处理信号
printf("Caught signal %d\n", sig);
}
int main() {
sigset_t sigset, oldset;
// 初始化信号集
sigemptyset(&sigset);
// 添加需要阻塞的信号到信号集中
sigaddset(&sigset, SIGINT);
sigaddset(&sigset, SIGQUIT);
// 阻塞信号
if (sigprocmask(SIG_BLOCK, &sigset, &oldset) < 0) {
perror("sigprocmask");
exit(1);
}
// 注册信号处理函数
if (signal(SIGINT, handle_signal) == SIG_ERR) {
perror("signal");
exit(1);
}
if (signal(SIGQUIT, handle_signal) == SIG_ERR) {
perror("signal");
exit(1);
}
// 在此处理你的任务...
// 解除阻塞
if (sigprocmask(SIG_SETMASK, &oldset, NULL) < 0) {
perror("sigprocmask");
exit(1);
}
// 程序继续运行...
pause(); // 暂停进程直到信号到来
return 0;
}
这段代码首先定义了两个信号,SIGINT
和SIGQUIT
,它们分别对应于Ctrl+C和Ctrl+\。然后,它使用sigprocmask
函数来阻塞这些信号,并保存旧的信号掩码。接下来,它使用signal
函数注册信号处理函数handle_signal
。在信号被阻塞的状态下,程序可以执行其他任务。最后,通过调用sigprocmask
来恢复之前保存的信号掩码,并通过pause
函数暂停程序,等待信号的到来。
当信号到达时,系统将调用先前注册的信号处理函数handle_signal
,在其中可以执行自定义的信号处理逻辑。这个例子展示了如何保存和处理信号,以及如何在程序中正确地使用这些函数。
评论已关闭