
こんにちわ,
今Cの学習をしています。
alarmの使用法なんですが,1度SIGALRMを捕らえて,シグナルハンドラの関数に飛んだ後,LONGJMPでもどってくると,2回目以降,alarmは使用できないのでしょうか。具体的には下記のとおりです。
jmp_buf fin;
main(){
int i,
x =0;
for(i=1;i<=5;i++){
signal(SIGALRM, timeout);
x=setjmp(fin);
if(x=1){
alarm(5);
/*何かを入力等を行う*/
alarm(0);
}
else
{
x=0;
}
}
}
void timeout()
{
longjmp(fin,1);
return;
}
このように何か入力まちをしていて入力されずに5秒まつと再度入力をするようなプログラムを5回,回したいのですが,うまくいきません。
よろしくおねがいします。
No.2ベストアンサー
- 回答日時:
#1です。
ちょっと訂正します。
#1の回答で、2回目以降もプロセスが終了することはなくなるはずですが、今度は5回でも100回でもforループを抜けないはずです。
というか、正確に言うと、ループしてないんですよ。
longjmp()でsetjmp()のところに舞い戻ってくるんですから、何回繰り返してもループ1回目なんですよね。
/*何か入力等をおこなう*/
という部分がSIGALRMの発生によってブロック解除されるものであれば(大抵の入力待ち関数はerrno=EINTRでエラー終了するものです)、
単純にsetjmp()とlongjmp()を削除してみてください。
こんどこそ、お望みの動作になるはずです。
参考まで。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
多重ループの抜け方
-
xmplayの使い方
-
イベントの発生を待つ
-
csh foreachで「*」でエラ...
-
Javaの質問です。 この問題の答...
-
プログラムはif文とforループが...
-
WinAPI「MsgWaitForMultipleObj...
-
ウィーンブリッジ発進回路
-
乱数の桁数指定、または範囲指定。
-
平方根 ニュートン法について
-
VBAでの一時停止と再開の方法
-
アクティブセルから、A列最終行...
-
円のHough変換をC言語で
-
perlで2つの配列を比較する方...
-
DBIを使ってのデータの取り出し...
-
チェックデジットについて
-
Excel VBA ユーザーフォームの...
-
perl入門
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
VBAでの一時停止と再開の方法
-
Escキーを押すと、中断する時と...
-
CSVファイルの特定の行だけを読...
-
VBAで3秒だけ時間を止めたい
-
範囲指定したセルを1つずつ飛...
-
UWSCに制限時間を付けたいです
-
乱数の桁数指定、または範囲指定。
-
「偶数・奇数の和」のフローチ...
-
DOSコマンドのループ内のTIMEコ...
-
DoEventsが必要な理由について
-
vb.netです。2次元配列の要素を...
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
EXCEL VBA ユーザーフォームの...
-
流れ図(フローチャート)が分か...
-
ループフリー
-
null 参照の例外が実行時に発生...
-
For文を使った九九表の作成
おすすめ情報