2016-03-26 43 views
0

我想捕獲SIGINT(CTRL + C)。 我希望當用戶鍵入CTRL + C它會殺死子進程,但父進程將正常繼續。 當我在我的程序中有子進程時它工作正常,但是當我沒有子進程時,我得到「分段錯誤」。分段故障信號處理程序sigint

我已經這樣做了:

void sig_handler(int signo); 
//======================================== 
int main() 
{ 
    // CTRL + C => SIGINT handler 
    struct sigaction act; 
    act.sa_handler = sig_handler; 
    sigfillset(&act.sa_mask); 
    act.sa_flags = 0; 

    // Catch the signal 
    sigaction(SIGINT, &act, NULL); 
... 
// done some checks and then fork a child. 
} 

// SIGINT handler 
void sig_handler(int signo) 
{ 
// dont know what to write here 
} 
+0

分叉你的子進程之前獲取當前的進程ID,然後把它分叉你的孩子並獲得它的進程ID,然後當處理信號時檢查ctrl c是否爲父進程ID,然後根據它實現你的邏輯。 – FZE

+0

你在哪行代碼中得到了分段錯誤? –

回答

0

我相信,剛剛通過sigset(),您可以實現自己的目標。

我會引用一些來自sigset手冊頁的信息。

sigset()函數修改信號處置。 sig參數 指定信號,它可以是除SIGKILL和SIGSTOP以外的任何信號。 disp參數指定信號的配置,可能是 SIG_DFL,SIG_IGN或信號處理程序的地址。如果使用sigset()爲 ,並且disp是信號處理程序的地址,則系統在執行信號處理程序之前將調用進程的信號掩碼添加到 ;當信號處理程序返回時,系統將調用進程的掩碼恢復到其在發送信號之前的狀態。另外,如果使用sigset(),並且disp等於SIG_HOLD,則將 sig添加到調用進程的信號掩碼中,並且sig的 配置保持不變。如果使用sigset(),並且disp不是 等於SIG_HOLD,則從調用的進程的信號掩碼中移除sig。

請參考以下鏈接:sighold, sigignore, sigpause, sigrelse, sigset — legacy interface for signal management

可以建立,當你得到SIGINT將被調用的處理函數。

void handler(int signo){ 
    // Here you can kill the child, if it exists 
} 

int main(int argc, char *argv[]) 
{ 
    ... 
    sigset(SIGINT, handler); 
    ... 
} 

希望它可以幫助你,如果你需要更多的幫助,只需在評論中提及它。

+0

請注意,如果答案解決了您的問題。 - 謝謝 – shahharshil46