调用alarm函数不起作用?
alarm 闹钟只能有一个,主函数中有两个alarm的时候,后一个alarm会把前一个alarm的剩余时间作为返回值,然后自己重新从0开始计数,前一个alarm就此成为历史。以上都测试成功了。
然而当我在sigaction的信号响应函数里调用alarm的时候,alarm函数不起作用。然后我在main函数里先调用一个alarm,然后再在sigaction的信号响应函数里调用alarm,此时后一个alarm终于可以以第二个时钟函数的身份闪亮登场了。
我的问题是:在sigaction的信号响应函数里调用alarm的时候,alarm函数为什么不起作用呢?sigaction捕捉的是ctrl+c。
代码如下
#include <signal.h>#include <stdio.h>#include <errno.h>#include <unistd.h> //STDERR_FILENO#define PROMPT "你想终止程序吗? " #define N 20#define M 10char *prompt=PROMPT; void ctrl_c_op(int signo) { write(STDERR_FILENO, prompt, strlen(prompt)); alarm(M);//时钟,M秒后退出 printf("[%d] 秒以后退出。", M);fflush(NULL);} int main() { int i; struct sigaction act; act.sa_handler=ctrl_c_op; //注册信号处理函数,信号的默认动作被屏蔽 sigemptyset(&act.sa_mask); act.sa_flags=0; //alarm(5);//时钟 if(sigaction(SIGINT, &act, NULL)<0) { fprintf(stderr,"Install Signal Action Error:%s\n\a",strerror(errno)); exit(1); } for(i=0; i<N; i++) { sleep(1); printf("%4d", N-i);fflush(NULL); }}