0

Linux シグナルを扱うプログラムを書いています。具体的には、シグナル SIGINT を子プロセスに再インストールしたいのですが、機能しないことがわかりました。

これが私のコードのより単純なバージョンです:

void handler(int sig){
    //do something
    exit(0);
}

void handler2(int sig){
    //do something
    exit(0);
}
int main(){

    signal(SIGINT, handler);

    if ((pid = fork()) == 0) {
        signal(SIGINT, handler2); // re-install signal SIGINT

        // do something that takes some time
        printf("In child process:\n");
        execve("foo", argv, environ); // foo is a executable in local dir

        exit(0);
    }else{
        int status;
        waitpid(pid, &status, 0); // block itself waiting for child procee to exit
    }

    return 0;
}

シェルが「In child process:」と出力しているときに、ctrl+c を押します。関数handlerは問題handler2なく実行されますが、実行されることはありません。

私のコードのこのバグを手伝ってくれませんか?

更新: プロセスの実行中に子プロセスに SIGINT シグナルを受信させたいのですfooが、それは可能ですか?

4

2 に答える 2

0

@gby の anwser は、包括的な背景知識を提供しています。共有ライブラリを使用しない別のソリューションを提供するためにここにいます。

子プロセスが停止または終了するたびに、親プロセスは SIGCHLD を受け取ります。この SIGCHLD シグナルを処理して、子プロセスが SIGINT によって終了されたかどうかを知ることができます。ハンドラーで:

pid_t pid = waitpid(pid_t pid,int * status,int options)

子プロセスのステータスは、waitpid 関数を使用して取得できます。

if(WIFSIGNALED(status) && (pid == child_pid)){
    if(WTERMSIG(status) == SIGINT){
       // now you know your foo has received SIGINT.
       // do whatever you like.
    }
 }
于 2014-07-05T05:03:10.813 に答える