为什么要触发SIGINT两次按预期工作?

oru*_*pov 0 c signals

这里我有一些代码示例:

/* some headers */
…
/****************/

void handler( int signum ){
    printf("Signal number: %d received\n", signum);
    signal(signum, SIG_DFL);
}

int main( int argc, char* argv[] ){
    signal(SIGINT, handler);

    while( "no signal was received" ){
        printf("another loop round\n");
        sleep(3);
    }

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我希望我的程序退出,在我的处理程序函数中定义的消息,在CTRL + C键盘组合后,就像它通常发生的那样,但我必须输入两次命令,并且只有在我第二次尝试它停止之后.我还想问另一个关于signal功能的问题.我发现了很多引用,人们会建议使用sigaction函数代替signal,但有些人说这样做会因兼容性原因而更好signal.你能给我一些关于我应该使用哪些提示的提示吗?提前致谢

alk*_*alk 5

有了这条线

signal(SIGINT, handler);
Run Code Online (Sandbox Code Playgroud)

你通过调用来替换默认行为,即退出程序handler().这就是为什么程序不会在信号接收时退出的原因.

handler()随后调用

signal(signum, SIG_DFL);
Run Code Online (Sandbox Code Playgroud)

重新设置默认行为SIGINT,即退出程序(下一次)接收信号.


OT:一个人不得printf()从信号处理程序中调用(以及其他人),在它(以及其他人)不保证异步信号安全.有关man 7 signal这些功能的列表,请参阅.