2016-05-29 88 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你讓它聽起來像編譯器是千里眼。事實並非如此。您的程序一次執行一條命令。一旦一個信號處理程序被註冊,並且直到另一個指令被給出,每當接收到一個信號時,處理程序被調用,並且一次執行一個命令。你在你的處理程序中放置了代碼來停止它,而系統確實停止了。 –