5/2(水)
★謎のWindows
昨日に引き続き今日も出勤であった。
ま、暦通りである。
静かだということで仕事もはかどるわけである。
と、思いきや、windowsプログラムである。
はまりまくりである。
unixでいうところの、signal()で飛び先を定義して、alarm()でtimeoutになったら、signalをraise()して、その先で、longjmp()して、というお決まりのことをやりたいだけであった。
windowsにもなぜかうまい具合にsignal()もraise()もlongjmp()もあるのである。
しかし、どういうわけだか、alarm()がないのだ。
SetTimer()なんてのもあるが、これも、なぜかうまく動かない。
しかたなく、alarm()を自前で作ってみた。
CreateThreadして、その子threadでSleepさせといてその後raise()するというものだ。
ちゃんと、raise()されると、signal()で定義した関数に飛んでいる。
非常にうまく動作しているように見えた。
が、しかし、あまかった。
longjmp()でお亡くなりになったのだ。
調べてみると、raiseが子threadで呼ばれるので、signalの飛び先へは子threadが飛んでいたのだ。
signal()はおやthreadで定義しているにもかかわらずだ。
これじゃ、使えん〜。
参考(ソースイメージ)
do_alarm()
{
Sleep(TIMEOUT);
raise(SIGINT);
}
alarm()
{
CreateThread(do_alarm);
}
timeout()
{
xxclose();
longjmp(env, -1);
}
main()
{
setjmp(env);
signal(SIGINT, timeout);
alarm();
xxxxx;
}
# 戻る