在自己的处理程序中捕获信号

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是此标志的过时,非标准同义词.


Tro*_*nic 6

你正在做的事情似乎是一个非常糟糕的主意,并且最好只从处理程序设置一个标志并从中返回,然后从main进行打印.

您需要SA_NODEFER在信号处理程序本身内设置或重新启用信号,否则信号会在调用处理程序之前被阻止或切换回其默认行为.

printf从信号处理程序调用是未定义的行为.它可能会使您的程序崩溃.实际上可以安全地从信号处理程序调用的函数列表非常有限.我需要一个glibc的异步信号安全功能列表