【问题标题】:Linux : Ignoring a signal inside a signal handler, ignoring all such successive signalsLinux:忽略信号处理程序中的信号,忽略所有此类连续信号
【发布时间】:2016-05-29 12:59:58
【问题描述】:

我有一个简单的程序来演示 C for Linux 中的信号处理。我只是将其复杂化以进行实验..

void sigquit(int signo)
{
    printf("Recieved signo : %d\n",signo);
    signal(SIGQUIT,SIG_IGN);
}

int main()
{

    /* register the signal handler */
    if(signal(SIGQUIT,sigquit) == SIG_ERR)
    {
        perror("Error handling SIGQUIT signal");
        exit(1);
    }
    for(;;);
    return 0;
}

我得到了输出:

^\Recieved signo : 3
^\^\^\^\^\^\^\

而我期待这个:

    ^\Recieved signo : 3
    ^\Recieved signo : 3
    ^\Recieved signo : 3
    ^\Recieved signo : 3

为什么只有第一次调用我的处理程序而不是进一步。我希望信号首先到达主线程,然后传递给处理程序。

【问题讨论】:

  • 那么signal(SIGQUIT,SIG_IGN); 这条线背后的想法是什么? ;-)

标签: c linux signal-handling


【解决方案1】:

信号(SIGQUIT,SIG_IGN);

从您的信号处理程序中,您告诉您的程序忽略信号发生的任何其他情况。结果,当您再次发送信号时,它会被忽略,就像您告诉它的那样。

【讨论】:

  • 混淆可能是由于我的理解。到目前为止,我的观点是,当程序以main() 开头时,它看到我想将sigint() 注册为处理程序。因此,它(不确定是编译器还是在运行时)注册 sigint 以在每次信号到来时被调用。 sigint() 里面的内容无关紧要。这可能对unix.stackexchange.com/questions/80044/… 有所帮助。我正在进一步探索它以使工作清晰。
  • "sigint() 中的内容无关紧要。" 为什么? :-S @InsaneCoder 尝试将int i = 0; i /= i; 放入处理程序中。 :-)
  • @InsaneCoder 你让它听起来像编译器是千里眼的。事实并非如此。您的程序一次执行一个命令。一旦注册了信号处理程序,直到给出另一条指令,每当收到信号时,都会调用处理程序,并一次执行一个命令。您在处理程序中放置了代码来停止它,系统确实停止了。
猜你喜欢
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多