我是新手,请保持温和!我从书中复制了代码:
#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);
可能有误。我是对的吗?
答案 0 :(得分:4)
你是对的,行
kill(getpid(), SIGALRM);
如果孩子要向其父母发送信号,则是错误的。事实上,它正试图向自己发送一个信号,因为他正在通过getpid()
传递他自己的pid(获取进程ID)。
您应该使用getppid()
(获取父进程ID),以便您可以将消息发送到父进程,如下所示:
kill(getppid(), SIGALRM);
答案 1 :(得分:1)
这一行:
kill(getpid(), SIGALRM);
由孩子执行,并向自己发送警报信号。
这一行:
signal(SIGALRM, ding);
父母是否为警报信号设置信号处理程序
这条线正在等待信号:
pause();
你需要孩子将信号发送给父母而不是自己,然后所有的多米诺骨牌都会掉下来。