システムコールを中断するために、SIGALARM で sigsetjmp と singlongjmp の組み合わせを使用しています。これを次のコードに示します。
//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" は異なるようです。
考えられる理由の 1 つは、sigsetjmp がメソッド ポインター「fpt」を含む以前の環境全体を復元できないことです。
この問題を解決するのを手伝ってくれませんか。本当にありがとう!