2016-12-09 23 views
1

私は、pause()がプログラムをスリープさせる原因となるため、pause()とユーザーの信号を使用しています。信号が受信されるまで。私はこれをやっている:ユーザー定義のシグナルを受け取ったときにプロセスがポーズしない

pid_t child = fork(); 
if(child < 0) { 
    perror("Fork error"); 
    exit(1); 
} 
    else if (child > 0) { //parent process 
    //do something here, then: 
     printf("Parent pausing\n"); 
     pause(); 
     printf("parent received sigusr2\n");  
     //do something 
     kill(child, SIGUSR2); 
     printf("Sent signal to child\n"); 
     sleep(1); 
     fflush(NULL); 
     pause(); 
     kill(child,SIGTERM);     
     waitpid(child, &status, 0); 
    } 
    else { //child process 
     //do something, then 
     printf("Child sending sigusr2\n"); 
     kill(getppid(), SIGUSR2); 
     printf("Child pausing\n"); 
     pause(); 
     //do something 
     kill(getppid(), SIGUSR2); 

     fflush(NULL); 
     printf(frompipe); 
     pause();    
} 

は(これは私が示すよ特定の問題が発生した後、まだコーディングであり得ていない問題がある可能性があります)。

Parent pausing 
Child sending sigusr2 
Child pausing 
User-defined signal 2 

そして親プロセスがシグナルを受け取っていないかのようにそれだけで(それがparent received sigusr2を印刷していないので)、そこに停止します。だから、私の現在の出力があります。プログラムは終了しますが、プロセスはバックグラウンドで停止します。私は間違って何をしていますか?

+2

あなたはありますかこれらのシグナルのシグナルハンドラ? 'man pause'から:* pause()は、プロセスを終了させるシグナルが送られるか、シグナル捕捉関数の呼び出しを引き起こすまで、呼び出しプロセス(またはスレッド)をスリープさせます。*** –

+0

同じものからマンページ、 'sigsuspend(2)'は一見価値があるかもしれません。 – Phillip

+0

私は 'pause()'自体がシグナルを捕まえたと思っていましたが...? –

答えて

1

@Eugene Sh。シグナルハンドラ関数が必要です。 pause(2) man page

pause()はシグナルが捕捉され、シグナル捕捉関数が返されたときにのみ返ります。

sigaction(2)でこれを行うには、あなたのプログラムに追加します。

void sigusr2_handler(int) { /* do nothing*/ } 

を次に、fork()呼び出しの前に、sigaction使用

struct sigaction sa; 
sa.handler = sigusr2_handler; 
sa.mask = 0; 
sa.sa_flags = 0; 
sigaction(SIGUSR2, sigusr2_handler); 

を追加することを意味しますが、それを無効にするまで、このハンドラが持続します(signal(2)とは異なります)。 forkコールの前にこれを置くと、それが親と子に適用されます。 the man pageは、 "fork(2)で作成された子は親の信号処理のコピーを継承します。"

このコードでは、pause()コールが返されます。メッセージを印刷したり、sigusr2_handlerの中で何か他のことをしたいのであれば、確かにそうすることができますが、私が読んだ一般的なアドバイスは、できるだけシンプルなハンドラを保つことです。

(デバッグ中ちなみに、私はまた、安全のために、すべてのprintffflushの呼び出しを追加します。私はそれが必要ではないはずだと思うが、それは傷つけることはできません!)

関連する問題