- 论坛徽章:
- 0
|
#include <stdio.h>
#include <setjmp.h>
#include <unistd.h>
#include <signal.h>
typedef void Sigfunc(int);
static jmp_buf env_alarm;
volatile int rtn_val;
static void old_sig_alarm(int signo)
{
printf("in old_sig_alarm()\n");
longjmp(env_alarm,1);
}
static void new_sig_alarm(int signo)
{
printf("in new_sig_alarm()\n");
longjmp(env_alarm,1);
}
int mysleep(unsigned int sec)
{
int old_alrm = -1;
Sigfunc *p;
if( (p = signal(SIGALRM,new_sig_alarm)) == SIG_ERR )
return(sec);
printf("the sig function 1 is %p\r\n", p);
if(setjmp(env_alarm)==0)
{
old_alrm = alarm(sec); //old_alarm保存此函数之前的alarm的秒数
if(old_alrm>0) //说明调用mysleep()之前有alarm()语句
{
if(old_alrm<sec) // alarm(3); mysleep(5); 的情况
{
signal(SIGALRM,p);
alarm(old_alrm);
rtn_val = 0;
pause();
}
else //alarm(5); mysleep(3); 的情况,也是我所遇到问题的情况
{
rtn_val = old_alrm - sec;
pause();
}
}
else //调用mysleep()之前没有alarm()语句
{
rtn_val = 0;
pause();
}
}
signal(SIGALRM,p); //返回之前把SIGALRM的处理函数恢复为默认的
printf("the sig function 2 is %p\r\n", p);
printf("the remain time is %d\r\n", rtn_val);
return(alarm(rtn_val));
}
int main(void)
{
signal(SIGALRM,old_sig_alarm); //设置SIGALRM的默认处理函数
alarm(5);
mysleep(3);
pause();
return 0;
}
作上述修改后,用gcc运行的结果(在windows下运行gcc):
$ ./a.exe
the sig function 1 is 0x401074
in new_sig_alarm()
the sig function 2 is 0x401074
the remain time is 2
in old_sig_alarm()
the sig function 2 is 0x4
the remain time is 2
7 [main] a 4064 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
Segmentation fault (core dumped)
错在什么地方应该已经很明显了~~~
[ 本帖最后由 goodluckwhh 于 2007-9-4 18:54 编辑 ] |
|