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);
}

正如作者所写:

dingSIGALRM,模拟闹钟。子进程在向其父进程发送信号之前等待五秒钟。


我试过上面的代码,但打印后没有反应alarm application starting

waiting for alarm to go off.所以我怀疑代码有逻辑错误。该行kill(getpid(), SIGALRM);可能是错误的。我对吗?

4

2 回答 2

4

你是对的,线

kill(getpid(), SIGALRM);

如果孩子要向其父母发送信号,则这是错误的。事实上,它正试图向自己发送信号,因为他正在通过getpid()(获取进程 ID)传递他自己的 pid。

您应该使用getppid()(get parent process id) 以便可以将消息发送到父进程,如下所示:

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

这一行:

kill(getpid(), SIGALRM);

由孩子执行并向自己发送警报信号。

这一行:

signal(SIGALRM, ding);

父级是否为警报信号设置了信号处理程序

而这条线正在等待信号:

pause();

您需要孩子将信号发送给父母而不是自己,然后所有的多米诺骨牌都会倒下。

于 2013-01-19T02:46:41.697 回答