4

私は初心者です、優しくしてください!私は本からコードをコピーしました:

#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

static int alarm_fired = 0;

void ding(int sig)
{
    alarm_fired = 1;
}

int main(int argc, char* argv[])
{
    pid_t pid;

    printf("alarm application starting\n");

    pid = fork();

    switch(pid)
    {
        case -1:
            perror("fork failed");
            exit(EXIT_FAILURE);
        case 0:
            sleep(5);
            kill(getpid(), SIGALRM);
            exit(EXIT_SUCCESS);
    }
    printf("waiting for alarm to go off\n");
    (void) signal(SIGALRM, ding);

    pause();
    if (alarm_fired)
        printf("Ding!\n");

    printf("done\n");
    exit(EXIT_SUCCESS);
}

著者が書いたように:

ding、目覚まし時計をシミュレートします。子プロセスはSIGALRM、親に信号を送信する前に5秒間待機します。


上記のコードを試しましたが、印刷しても応答がありませんalarm application starting

waiting for alarm to go offだから私はコードに論理エラーがあるのではないかと疑っています。行kill(getpid(), SIGALRM);が間違っている可能性があります。私は正しいですか?

4

2 に答える 2

4

あなたは正しい、ライン

kill(getpid(), SIGALRM);

子が親に信号を送信する場合は間違っています。getpid()現状では、彼は自分のpidを(プロセスIDを取得)で渡しているので、自分自身にシグナルを送信しようとしています。

getppid()次のようにメッセージを親プロセスに送信できるように、(親プロセスIDを取得)を使用する必要があります。

kill(getppid(), SIGALRM);
于 2013-01-19T02:44:06.600 に答える
1

この行:

kill(getpid(), SIGALRM);

子によって実行され、アラーム信号を自分自身に送信しています。

この行:

signal(SIGALRM, ding);

親はアラーム信号の信号ハンドラを設定していますか

そして、この回線は信号を待っています:

pause();

子供が自分自身ではなく親に信号を送信する必要があります。そうすると、すべてのドミノが倒れます。

于 2013-01-19T02:46:41.697 に答える