1

私がやりたいことは、5 秒間続く親プロセスを作成することです。SIGUSR1また、毎秒信号を送信したいと考えています。この信号で、私は子供に何かをしてもらいたい.

これまでにまとめたコードは次のとおりです。

void alarmHandler(int sig) {
    printf("\nalarm called\n");
    exit(0);
}


void childHandler(int sig) {
    printf("child called");
    signal(SIGUSR1, childHandler);
}

int main() {
    pid_t val;

    if((val = fork())) { //parinte
        signal(SIGALRM, alarmHandler);
        printf("parent");
        alarm(5);
        while(1) {
            kill(val, SIGUSR1);
            sleep(1);
        }
    }else { 
        signal(SIGUSR1, childHandler);
        printf("child");
    }

    return 0;
}  

私が得るものは次のとおりです。

child
parent
alarm called  

私が欲しいもの:

child 
parent
child called
child called
child called
child called
child called
alarm called
4

2 に答える 2

1

あなたの親にはwhileループがあります。子は次のことを行います。

signal(SIGUSR1, childHandler);
printf("child");

そして、終了します。

終了前に受信した場合SIGUSR、これも実行されます

printf("child called");
signal(SIGUSR1, childHandler);

したがって、呼び出された子の数が出力されるため、競合状態になります。

while (1) {}後にprintf("child");

于 2012-12-04T19:49:52.977 に答える