2017-05-31 62 views
-1

下面是這個問題的簡單娛樂:SIGINT葛被逮住一次

void handler(int sig){ 
     if(sig == SIGINT){ 
       printf("Signal caught\n"); 
       execl("./recreate","./recreate",NULL); 
     } 
} 

int main(){ 
    printf("Main start\n"); 
    signal(SIGINT,handler); 
    while(1); 

     return 0; 
} 

它只是接收到信號後,再次運行本身。會發生什麼,它只能從終端讀取CTR + C一次。從第二點開始,簡單地在控制檯上寫^ C。我是否需要每次重置處理程序或類似的東西?提前致謝。

+1

'signal'的行爲取決於你的Unix變體。爲了獲得一致的行爲,請使用['sigaction'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)。 –

+0

通常有良好的信號處理文檔,特別是'signal()'函數可以在線獲取,也可以通過'man'命令獲得。 –

+1

另請注意,'printf'不被認爲是在信號處理程序中調用的安全函數。 –

回答

0

signal是高度實現定義的,因此您應該使用sigaction。你正在觀察的是signal的所謂sysv語義 - 信號在處理程序中重置爲SIG_DFL,並且它不會被阻止重新執行。

你可能想是這樣的:

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

#define WRITE_LIT(fd, lit) write(fd, lit, sizeof lit - 1) 

void handler(int sig){ 
     if(sig == SIGINT){ 
      WRITE_LIT(2, "Signal caught\n"); 
      execl("./recreate","./recreate", (char*)NULL); 
      WRITE_LIT(2, "Couldn't run ./recreate\n"); 
      _exit(127); 
     } 
} 

int main(){ 
    printf("Main start\n"); 
    sigaction(SIGINT, &(struct sigaction const){ 
     .sa_handler = handler, 
     .sa_flags = SA_NODEFER /*don't block signals for the new process image*/ 
    }, 
    0); 
    while(1); 
     return 0; 
} 

這不會復位信號,它不會阻止它或者(默認爲阻止它的處理程序的時間),因爲新工藝圖像可能不會希望它被阻止。