2016-07-31 19 views
0

最初に呼び出されたときにSIGQUITシグナルを無視し、2番目のSIGQUITシグナルで終了するプロセスにシグナルハンドラをインストールする関数を作成しようとしています。私はカウンタにSIGQUITシグナルが送られた回数を数えるためにグローバル変数を使うつもりです。一度SIGQUITを無視する

しかし、これを実装する際に問題が発生しています。私は最初のSIGQUITシグナルを無視するSIG_IGNを見つけましたが、最初にシグナルを検出してカウンタをインクリメントします(シグナルハンドラを呼び出すためにシグナル()を変更することができます)?

私のコードは以下の通りです:

// global var counter 
int signal_counter = 0; 

int main (int argc, const char * argv[]) { 

    pid_t child_pid = 0; 
    int child_status = 0; 

    /* fork a child process... */ 
    child_pid = fork(); 

    if(child_pid < 0) { /* fork() and check if there were errors */ 
     perror("fork"); /* print a system-defined error message */ 
     exit(EXIT_FAILURE); 
    } 

    else if(child_pid == 0) { /* Child code */ 
     install_handler(); 
     for(; ;sleep(1)); /*loop forever*/ 
    } 

    else { /* Parent code */ 
     printf("Parent processing starts\n"); 
     printf("\nPARENT: sending first SIGQUIT\n\n"); 
     kill(child_pid,SIGQUIT); 
     printf("\nPARENT: doing something\n\n"); 
     sleep(3); 
     printf("\nPARENT: sending SIGQUIT again\n\n"); 
     kill(child_pid,SIGQUIT); 
    } 

    return EXIT_SUCCESS; 

} 

void sigquit() { 
    printf("SIGQUIT\n"); 
    sleep(2); 
    exit(0); 
} 

void install_handler(){ 
    if (signal_counter == 0){ 
     signal(SIGQUIT, sigquit); 
     signal_counter+=1; 
    } 
    else{ 
     signal(SIGQUIT, sigquit); 
    } 
} 

任意の助けをいただければ幸いです。

+2

SIG_IGNは使用しないでください。着火した信号はカウントできません。 –

+0

しかし、最初のSIGQUITをどうやって無視するのですか? – Seb

+1

あなたは明らかにそれを無視することはできません。それを処理し、ハンドラのカウンタをインクリメントします。 –

答えて

1

解決策は、posix標準を使用することです。それによると、インストールされた信号はワンショットです。

初めて信号が到着すると、指定された方法が開始されます。したがって、別の信号が到着した場合、それは正常に実行されます(つまり、あなたのアプリケーションを終了させる)。

関連する問題