2012-06-18 19 views
0

簡單代碼:的sigaction SIGINT,在外殼PROGRAMM運行與&(背景)沒有得到信號

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

using namespaces td;                
bool unblock = false;             
long int ile = 0;             

void ouch(int sig) { 
    cout << "signal " << sig << endl;        
    unblock = true;             
}                 
int main(){               
    struct sigaction act;           
    act.sa_handler = ouch;           
    sigemptyset(&act.sa_mask);         
    act.sa_flags = 0;            
    sigaction(SIGINT, &act, 0);          

    do {               
     cout << "." << endl;           
    } while(!unblock);               

    cout << "EXIT" << endl;           
} 

現在我編譯代碼和我得到的「的a.out」。 當我像這樣運行的a.out:

[[email protected] test]$ ./a,out 

運行與預期,當我按CTRL + C就像需要 程序退出但是,當我像這樣運行程序(這是必要的我的項目):

[[email protected] test]$ ./a.out& 

操作系統傳遞控制的殼,我無法用CTRL + C打破循環

我需要運行在bash腳本的代碼,我需要運行在背景中。在這種情況下能否以某種方式捕捉到信號?

+1

請參閱'man kill'。 – BoBTFish

回答

3

當您按ctrl-c時,發送信號2(SIGINT)到當前進程(在終端的前臺運行的進程)。當你說%%你的意思最後一個後臺進程

$ kill -2 %% 

:您可以將使用kill的信號處理,在後臺運行(開始用&)。當然你可以指定另一個。您需要知道其PID(請參閱ps(1))或JobID(bash(1)/ jobs)。

我想要說明的是,只能在作業管理的shell中使用%-notation(例如bash)。當你不在這樣的shell中時,你只能使用PID。

上次啓動的進程的PID爲$!。這在某些腳本中可能很有用。

+0

什麼是'%%'??? –

+1

'%%'是後臺最後作業的作業ID(請參閱bash(1)/作業) –

+0

謝謝。這是我需要的! –