- 论坛徽章:
- 0
|
- #include <unistd.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <stdio.h>
- #include <time.h>
- #include <setjmp.h>
- typedef void (*Handler)(int);
- static jmp_buf env_alrm;
- static void pr_time()
- {
- time_t now;
- time(&now);
- printf("current timestamp:%ld\n",now);
- }
- static void sig_alrm(int signo)
- {
- printf("received signal.\n");
- longjmp(env_alrm,1);
- }
- unsigned int sleep1(unsigned int nsecs)
- {
- volatile Handler handler;
- volatile int left_sec;
- if((left_sec=alarm(0))<nsecs)
- {
- return(alarm(left_sec));
- }
- if ((handler=signal(SIGALRM,sig_alrm))==SIG_ERR)
- {
- return(nsecs);
- }
- left_sec=left_sec-nsecs;
- if(setjmp(env_alrm)==0)
- {
- alarm(nsecs);
- //这里如果有竞争条件怎么办,会导致信号丢失的。。
- printf("wating to wake up from pause\n");
- pause();//休眠
- }
- if(signal(SIGALRM,handler)==SIG_ERR)
- {
- printf("recover error.\n");
- }
- printf("left_sec:%d\n",left_sec);
- return(alarm(left_sec));
- }
- int main(void)
- {
- alarm(5);
- pr_time();
- sleep1(3);
- pr_time();
- printf("i am here.\n");
- pause();
- exit(0);
- }
复制代码 模拟sleep函数,当不使用setjmp的时候,代码能正确运行,当使用的setjmp的时候,alarm好像没反应了。。。
求指导啊。。。。
|
|