我是一个新手,请温柔!我抄了一本书的代码:
#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();
您需要孩子将信号发送给父母,然后所有的多米诺骨牌都会掉下来。