微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

#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 startingn"); 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 offn"); (void) signal(SIgalRM,ding); pause(); if (alarm_fired) printf("Ding!n"); printf("donen"); exit(EXIT_SUCCESS); }

正如作者所写:

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

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

出现信号处理程序时出现分段错误

在linux中创build一个新的信号

如何避免由于Linux中的信号而中断睡眠呼叫

让孩子在fork中等待父母()

信号处理期间堆损坏

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

SignalR可以用来从控制台应用程序发送一个消息,将显示在浏览器中?

为什么由bash脚本启动的进程在terminalclosures后不会退出

为什么我的linux信号处理程序只运行一次

发送TERM信号给在父进程的另一个线程中产生的subprocess

OpenSSL和信号

你是对的,行

kill(getpid(),SIgalRM);

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

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

kill(getppid(),SIgalRM);

这一行:

kill(getpid(),SIgalRM);

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

这一行:

signal(SIgalRM,ding);

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

这条线正在等待信号:

pause();

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐