我正在产生信号并面对奇怪的行为

时间:2017-04-07 05:10:22

标签: c linux systems-programming

我已经开始在Linux中接收信号了,但是我的代码中发生了一些奇怪的行为。我刚刚开始,我也搜索了它,但我没有找到任何东西,对不起,如果问题太蹩脚,这里是代码 -

void Handler(int sig ){
    printf("Inside Handler\n");
}

int main(int argc, char * argv[], char * envp[]){
    if( signal(SIGINT, Handler) ==SIG_ERR )
        exit(EXIT_FAILURE);

    for(size_t i = 0; ; i++){
        printf("%d\n", i);
        sleep(2);
    }
}

我知道printfsignal来电并不是一个好主意,但到目前为止我还没有研究sigaction。现在根据我的书和其他教程,如果我按ctrl+c,那么每次都要调用Handler,但这是奇怪的事情:当我按ctrl+c一次时,它正在调用{{ 1}}但下次它终止程序。为什么会发生这种奇怪的事情?

3 个答案:

答案 0 :(得分:1)

signal系统调用的手册页说:

  

如果信号符号传递给进程,则会发生以下情况之一:

     
      
  • 如果处置设置为SIG_IGN,则忽略该信号。

  •   
  • 如果处置设置为SIG_DFL,则会发生与信号关联的默认操作(请参阅signal(7))。

  •   
  • 如果处置设置为函数,则首先将处置重置为SIG_DFL,或者阻止信号(请参阅下面的可移植性),然后处理程序是用参数signum调用。如果调用处理程序导致信号被阻止,那么从处理程序返回时信号将被解除阻塞。

  •   

由于SIGINT的默认行为是在信号重置为默认行为后终止,因此后续行为不同。

答案 1 :(得分:0)

传递signalSIG_DFL以外的处理程序时SIG_IGN的行为未定义。为此目的使用sigaction

正如docs所说:

  

signal()的唯一可移植用途是将信号的处置设置为SIG_DFLSIG_IGN。使用signal()建立信号处理程序时的语义因系统而异(而POSIX.1明确允许这种变化);不要将它用于此目的。

答案 2 :(得分:0)

以下是我在您的帮助下编写的代码,该代码工作正常,我相信这将在每个平台上都能很好地工作

#define _GNU_SOURCE

void Handler(int sig ){
printf("Inside Handler\n");
}

int main(int argc, char *argv[], char *envp[] ){
sighandler_t Action =Handler;

if( Action == SIG_DFL ){
Action = Handler;
}

if( signal(SIGINT, Action ) == SIG_ERR )
  exit(EXIT_FAILURE );

for(size_t k = 0 ; ; k++ ){
 printf("%d\n", k );
 sleep(2);
}

}