alarm函数
场景:调用alarm函数不起作用?解决方案
调用alarm函数不起作用?
alarm 闹钟只能有一个,主函数中有两个alarm的时候,后一个alarm会把前一个alarm的剩余时间作为返回值,然后自己重新从0开始计数,前一个alarm就此成为历史。以上都测试成功了。
然而当我在sigaction的信号响应函数里调用alarm的时候,alarm函数不起作用。然后我在main函数里先调用一个alarm,然后再在sigaction的信号响应函数里调用alarm,此时后一个alarm终于可以以第二个时钟函数的身份闪亮登场了。
我的问题是:在sigaction的信号响应函数里调用alarm的时候,alarm函数为什么不起作用呢?sigaction捕捉的是ctrl+c。
代码如下
------解决方案--------------------
我的测试结果
./a.out
20你想终止程序吗? [10] 秒以后退出。 19 18 17 16 15 14 13 12 11 10Alarm clock
10秒后成功退出了阿。。而且是在main函数里alarm注释掉的情况下的
------解决方案--------------------
程序没有任何问题呀!
只是编译有警告:
需要加:
#include <stdlib.h>
#include <string.h>
最后需要加:
return 0;
调用alarm函数不起作用?
alarm 闹钟只能有一个,主函数中有两个alarm的时候,后一个alarm会把前一个alarm的剩余时间作为返回值,然后自己重新从0开始计数,前一个alarm就此成为历史。以上都测试成功了。
然而当我在sigaction的信号响应函数里调用alarm的时候,alarm函数不起作用。然后我在main函数里先调用一个alarm,然后再在sigaction的信号响应函数里调用alarm,此时后一个alarm终于可以以第二个时钟函数的身份闪亮登场了。
我的问题是:在sigaction的信号响应函数里调用alarm的时候,alarm函数为什么不起作用呢?sigaction捕捉的是ctrl+c。
代码如下
- C/C++ code
#include <signal.h> #include <stdio.h> #include <errno.h> #include <unistd.h> //STDERR_FILENO #define PROMPT "你想终止程序吗? " #define N 20 #define M 10 char *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); } }
------解决方案--------------------
我的测试结果
./a.out
20你想终止程序吗? [10] 秒以后退出。 19 18 17 16 15 14 13 12 11 10Alarm clock
10秒后成功退出了阿。。而且是在main函数里alarm注释掉的情况下的
------解决方案--------------------
程序没有任何问题呀!
只是编译有警告:
需要加:
#include <stdlib.h>
#include <string.h>
最后需要加:
return 0;