我使用 sigsetjmp 和 singlongjmp 和 SIGALARM 来中断系统调用,如下代码所示
//data of Alarm_interrupter
void (TClass::*fpt)(const char*); // pointer to member function
TClass* pt2Object; // pointer to object
===================================================
//for timeout processing
static sigjmp_buf jmpbuf;
static void recvfrom_alarm(int) {
siglongjmp(jmpbuf, 1);
}
======================================================
void Alarm_interrupter::start_timeout() {
signal(SIGALRM, recvfrom_alarm);
alarm(timeout);
(*pt2Object.*fpt)("timeouted before sigsetjmp"); //this call works OK
if (sigsetjmp(jmpbuf,1) != 0) {
//at this point, pt2Object is still OK,
//but fpt seems to point to nothign.
(*pt2Object.*fpt)("timeouted after sigsetjmp");
}
return;
}
==============================================================
在 sigsetjmp 返回 1 之前,使用对象和方法指针的调用:*pt2Object.*fpt("timeouted before sigsetjmp") 是可以的,但是在 sigsetjmp 返回 1 之后,此调用失败。检查变量的状态后,我注意到对象指针“pt2Object”仍然可以,但方法指针“fpt”似乎有所不同。
我认为造成这种情况的一个可能原因是 sigsetjmp 无法恢复整个早期环境,其中包括方法指针“fpt”。
你们能帮我解决这个问题吗?非常感谢!