这段代码有逻辑错误吗?

时间:2013-01-19 02:38:57

标签: c linux signals

我是新手,请保持温和!我从书中复制了代码:

#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信号之前的几秒钟。


我尝试了上面的代码,但在打印alarm application starting

后没有响应

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

2 个答案:

答案 0 :(得分:4)

你是对的,行

kill(getpid(), SIGALRM);
如果孩子要向其父母发送信号,则

是错误的。事实上,它正试图向自己发送一个信号,因为他正在通过getpid()传递他自己的pid(获取进程ID)。

您应该使用getppid()(获取父进程ID),以便您可以将消息发送到父进程,如下所示:

kill(getppid(), SIGALRM);

答案 1 :(得分:1)

这一行:

kill(getpid(), SIGALRM);

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

这一行:

signal(SIGALRM, ding);

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

这条线正在等待信号:

pause();

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