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;
}


内容 名前
# 戻る