0

私はプロセス間通信のシグナルを学習しています。以下の非常に単純なテストコードを作成しました。

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

void sighup();
void sigint();
void sigquit();

int main(int argc, const char *argv[])
{
    int child_pid;
    if((child_pid = fork()) < 0) exit (1);
    if(child_pid == 0) {
        sleep(2);
        signal(SIGHUP, sighup);
        signal(SIGINT, sigint);
        signal(SIGQUIT, sigquit);
        puts("this is the end of the child process");
    } else {
        printf("\n Parent: sending SIGHUP signal to child\n\n");
        kill(child_pid, SIGHUP);
        printf("\n Parent: sending SIGINT signal to child\n\n");
        kill(child_pid, SIGINT);
        printf("\n Parent: sending SIGQUIT signal to child\n\n");
        kill(child_pid, SIGQUIT);
    }
}

void sighup() {
    signal(SIGHUP, sighup);
    printf("CHILD: I have received a SIGHUP\n");
}
void sigint() {
    signal(SIGINT, sigint);
    printf("CHILD: I have received a SIGINT\n");
}

void sigquit() {
    sleep(2);
    printf("CHILD: My parent process has killed me!!");
    printf("CHILD: cleaning up...\n");
    exit(0);
}

子プロセスは何もしないようで、プロセス文字列の末尾を出力しません。何か案が?

4

1 に答える 1

1

競合状態のため、子でシグナル ハンドラーが呼び出されていません。親スレッドは、子スレッドがsignal()シグナル処理動作をオーバーライドする前に、シグナルを子スレッドに送信します。

この場合、子は を受け取り、SIGINTデフォルトの動作である終了を実行します。したがって、子は の後のステートメントを実行する前に終了しsleep(2)ます。

于 2012-10-28T04:20:28.740 に答える