Abh*_*ogi 11 c unix posix signals sigint
#include<stdio.h>
#include<signal.h>
void handler(int signo)
{
printf("Into handler\n");
while(1);
}
int main()
{
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(& act.sa_mask);
sigaction(SIGINT, &act, NULL);
while(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在捕获KeyboardInterrupt一次之后,当我再次按下"Ctrl + C"时,不处理SIGINT ...我打算每次按"Ctrl + C"时都应该打印"Into handler ".
我想在"SIGINT handler()"本身内捕获SIGINT.
Mar*_*ett 10
您需要在sa_mask上设置SA_NODEFER以捕获与您当前正在处理的信号相同的信号:
SA_NODEFER:不要阻止从自己的信号处理程序中接收信号.SA_NOMASK是此标志的过时,非标准同义词.
你正在做的事情似乎是一个非常糟糕的主意,并且最好只从处理程序设置一个标志并从中返回,然后从main进行打印.
您需要SA_NODEFER
在信号处理程序本身内设置或重新启用信号,否则信号会在调用处理程序之前被阻止或切换回其默认行为.
printf
从信号处理程序调用是未定义的行为.它可能会使您的程序崩溃.实际上可以安全地从信号处理程序调用的函数列表非常有限.我需要一个glibc的异步信号安全功能列表