2016-05-29 146 views
-1

我有一个简单的程序来演示C for Linux中的信号处理。我只是尝试复杂吧..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 

为什么只有第一次我的处理程序被调用和没有进一步。我预计这些信号将首先进入主线程,然后传递给处理程序。

+0

那么这条线'signal(SIGQUIT,SIG_IGN)背后有什么想法;'尽管? ;-) – alk

回答

3

signal(SIGQUIT,SIG_IGN);

从你的信号处理程序,你告诉你的程序忽略任何进一步的信号发生的情况。因此,当您再次发送信号时,就会像您告诉的那样忽略它。

+0

混淆可能是由于我的理解。到目前为止,我认为当程序以'main()'开始时,它看到我要注册'sigint()'作为处理程序。所以,它(不知道是否编译器或运行时)注册'sigint'每次信号到来时被调用。 sigint()里面的内容是无关紧要的。这可能有助于http://unix.stackexchange.com/questions/80044/how-signals-work-internal。为了让工作更清晰,我正在探索它。 –

+0

“* sigint()里面什么都不相关。”为什么? :-S @InsaneCoder试着把'int i = 0;我/ =我;'处理程序内部。 :-) – alk

+0

@InsaneCoder你让它听起来像编译器是千里眼。事实并非如此。您的程序一次执行一条命令。一旦一个信号处理程序被注册,并且直到另一个指令被给出,每当接收到一个信号时,处理程序被调用,并且一次执行一个命令。你在你的处理程序中放置了代码来停止它,而系统确实停止了。 –