• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:alarmの使用について)

alarmの使用について

このQ&Aのポイント
  • Cの学習中にalarmの使用法についての質問です。SIGALRMを捕らえてシグナルハンドラの関数に飛び、LONGJMPで戻ってくると2回目以降alarmが使用できなくなりますか?
  • 質問者は、入力待ちをしていて5秒待っても入力がなかった場合に再入力をするようなプログラムを5回繰り返したいと考えていますが、うまくいかないそうです。
  • 要約文3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#1です。 ちょっと訂正します。 #1の回答で、2回目以降もプロセスが終了することはなくなるはずですが、今度は5回でも100回でもforループを抜けないはずです。 というか、正確に言うと、ループしてないんですよ。 longjmp()でsetjmp()のところに舞い戻ってくるんですから、何回繰り返してもループ1回目なんですよね。 /*何か入力等をおこなう*/ という部分がSIGALRMの発生によってブロック解除されるものであれば(大抵の入力待ち関数はerrno=EINTRでエラー終了するものです)、 単純にsetjmp()とlongjmp()を削除してみてください。 こんどこそ、お望みの動作になるはずです。 参考まで。

その他の回答 (1)

回答No.1

ループ2回目でプロセスが死んでしまう、という状況ですよね? SIGALRMは発生すると、デフォルトに戻ります。 (SIGALRMのデフォルト動作はプロセス終了です。) 言い換えると、 ループ一回目は、signal(SIGALRM, timeout)が効いていますが、 ループ二回目は、signal(SIGALRM, SIG_DFL)状態 ということです。 signal(SIGALRM, timeout); x=setjmp(fin); を x=setjmp(fin); signal(SIGALRM, timeout); とすると、お望みの動作になりますよ。 参考まで。

関連するQ&A