简单信号 – C编程和报警function

#include  #include  void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } int main(int argc, char *argv[]) { alarm(2); /* set alarm clock */ while (1) ; printf("All done"); } 

我希望程序在2秒后打印“你好”,而输出是“zsh:alarm ./a.out”

知道发生了什么事吗?

你忘记了最初设置警报处理程序。 更改main()的开头,如:

 int main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); ... 

此外,信号处理程序可能不会打印任何内容。 那是因为C库缓存输出直到它看到行结束。 所以:

 void ALARMhandler(int sig) { signal(SIGALRM, SIG_IGN); /* ignore this signal */ printf("Hello\n"); signal(SIGALRM, ALARMhandler); /* reinstall the handler */ } 

对于真实世界的程序,从信号处理程序打印不是很安全。 信号处理程序应该尽可能少,最好只在这里或那里设置一个标志。 并且该标志应该被声明为volatile

您没有在main函数中设置处理程序。

在你做alarm(2) ,把signal(SIGALRM, ALARMhandler); 在你的main

它应该工作。

请注意,永远不会打印“All Done”,因为在信号处理器运行后您将保持while(1)循环。 如果你想要打破循环,你需要有一个信号处理程序改变的标志。

 #include  #include  /* number of times the handle will run: */ volatile int breakflag = 3; void handle(int sig) { printf("Hello\n"); --breakflag; alarm(1); } int main() { signal(SIGALRM, handle); alarm(1); while(breakflag) { sleep(1); } printf("done\n"); return 0; } 

您不是先安装信号处理程序。
您需要在实际接收信号之前告诉系统您要处理信号,因此您需要在信号到来之前从main调用signal()

 int main(int argc, char *argv[]) { signal(SIGALRM, ALARMhandler); /* install the handler */ alarm(2); /* set alarm clock */ while (1); } 

安道尔很严谨。 我测试了这个,版本1打印(每秒):

 Hi... Hi... Hi... Hi... BYE Hi... ... 

版本2打印(每五秒钟):

 Hi...Hi...Hi...Hi...BYE Hi...Hi...Hi...Hi...BYE ... 

所以代码是:

 #include  #include  #include  # define T 5 int flag = T; void sigalrm_handler(int); int main(void) { signal(SIGALRM, sigalrm_handler); alarm(1); while (1); } void sigalrm_handler(int sig) { if(--flag){ printf("Hi...\n"); /*version 1*/ /*printf("Hi...");*/ /*version 2*/ }else{ printf("BYE\n"); flag=T; } alarm(1); }