简单信号 – 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); }