2016-03-26 5 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がシグナルハンドラのアドレスである場合、シグナル ハンドラを実行する前に、呼び出し側プロセスのシグナルマスク にsigを追加します。シグナルハンドラが復帰すると、システムは、 シグナルを シグナルの配信前の状態に復元します。さらに、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

関連する問題