自定义SIGINT信号处理程序 - 即使捕获到信号,程序仍会终止

时间:2015-07-08 06:45:42

标签: c linux signals posix

我正在玩signal.hunistd.h库,我遇到了一些问题。在下面的代码中,当我通过调用SIGINTCTRL-C信号发送到正在运行的程序时,信号被捕获。但是,再次按CTRL-C时,程序将终止。据我了解,每次按"Received signal 2"时都应打印打印语句CTRL-C

我对此信号的理解是否不正确,或者我的代码中是否有错误?

感谢您的投入!

#include "handle_signals.h"


void sig_handler(int signum)
{
    printf("\nReceived signal %d\n", signum);
}

int main()
{
    signal(SIGINT, sig_handler);
    while(1)
    {
        sleep(1);
    }
    return 0;
}

终端输出:

xxx@ubuntu:~/Dropbox/xxx/handle_signals$ ./handle_signals 
^C
Received signal 2
^C
xxx@ubuntu:~/Dropbox/xxx/handle_signals$ 

编辑:这是我收录的标题

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>


void sig_handler(int signum);

感谢您的回复。现在阅读它们!

2 个答案:

答案 0 :(得分:4)

请勿使用signal,请使用sigaction

  

signal()的行为在UNIX版本中各不相同,并且在不同版本的Linux上也有不同的历史变化。 避免使用:改为使用sigaction(2)。

http://man7.org/linux/man-pages/man2/signal.2.html

  

在原始UNIX系统中,当使用signal()建立的处理程序通过传递信号来调用时,信号的处置将重置为SIG_DFL,并且系统不会阻止其他实例的传递。信号。

Linux实现了相同的语义:处理程序在传递信号时被重置。

答案 1 :(得分:2)

signal在收到第一个信号时的行为因实施不同而异。通常,它需要在接收到信号后重新安装处理程序,因为处理程序已重置为其默认操作:

void sig_handler(int signum)
{  
    signal(SIGINT, sig_handler);
    printf("\nReceived signal %d\n", signum);
}

这是您不应再使用signal并使用sigaction的原因之一。你可以在这里看到using sigaction的裸骨示例。