
こんにちわ,
今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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UWSCの終了の仕方
-
<select size='7' multiple>...
-
プログラミングについて。 1つ...
-
ListBox 複数選択 で オートフ...
-
なぜⅰなのか?
-
「シにたい」って文字にして言...
-
Do ~ Loopの文字列条件
-
VBAコードでメッセージがうまく...
-
servletからjspへ戻った後のラ...
-
sscanfより速い方法について。
-
プログラミングの流れ図の問題...
-
【緊急】VisualBasicのマルチタ...
-
VBのFor構文の中で、Cのnextの...
-
JavaマルチスレッドでSleepを使...
-
組んだプログラミングの全体の...
-
VBA for i=1 to lastrow
-
COBOLプログラム
-
モンテカルロ法
-
USWCの使い方をおしえてください
-
このマクロの繰り返し?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
流れ図(フローチャート)が分か...
-
CSVファイルの特定の行だけを読...
-
範囲指定したセルを1つずつ飛...
-
VBAでの一時停止と再開の方法
-
乱数の桁数指定、または範囲指定。
-
VBA for i=1 to lastrow
-
VBAで3秒だけ時間を止めたい
-
vb.netです。2次元配列の要素を...
-
エクセルの当番表を作っていま...
-
vb.netからエクセル関数書き込み
-
DOSコマンドのループ内のTIMEコ...
-
「偶数・奇数の和」のフローチ...
-
GIFアニメをループさせたくない
-
Do whileでExitせず、ループの...
-
VB2010でCSVファイルの読み込み
-
【VBA】全て空白のセルの列の非...
-
アクティブセルから、A列最終行...
おすすめ情報