这段代码是否有逻辑错误?

我是一个新手,请温柔!我抄了一本书的代码:

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

正如作者所写:

模拟一个闹钟。在发送一个SIGALRM信号给它的父节点之前,subprocess等待五秒钟。


我尝试了上面的代码,但打印alarm application starting后没有任何反应

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

你是对的,行

 kill(getpid(), SIGALRM); 

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

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

 kill(getppid(), SIGALRM); 

这一行:

 kill(getpid(), SIGALRM); 

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

这一行:

 signal(SIGALRM, ding); 

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

这条线正在等待信号:

 pause(); 

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