
SIGALRMが跳ねると登録してあるコールバック関数が呼ばれるのですが、その関数の処理後にプロセスが終了してしまいます。その理由が知りたいので教えてください。
実行してみると
--------------------------------
callback_start .....コールバック関数のprint分を実行
callback_end .....コールバック関数のprint分を実行
アラームクロック
--------------------------------
3行目のメッセージがどこからか出力されます。
ちなみにdbxでコールバック関数を止めてみると
関数内の1行目でnextを実行すると
--------------------------------
シグナル 14 (SIGALRM) で終了中
--------------------------------
と出力されます。
マシンはSolaris8でC言語です。
シグナルのマスク処理等はなにもなく、signal()関数が呼ばれているだけです。
よろしくお願いします。

No.1ベストアンサー
- 回答日時:
コールバック関数の登録は、どのようにされましたでしょうか。
signal関数で登録した場合は、SIGALRMにより、この関数が呼ばれると、デフォルト状態に戻ります。従って、2回目のSIGALRMが発生したときに、異常終了します。
コールバック関数を、CallBackとすると、
signal(SIGALRM,CallBack);
・・
・・
void Callback(int sig)
{
//printf文
}
のようになっているとき、
void Callback(int sig)
{
signal(SIGALRM,CallBack); //これを追加
//printf文
}
このことにより、SIGALRMが発生する都度、シグナルハンドラーが再設定されます。これで、終了しなくなるはずです。
(但し、この方法はシグナルが速射された場合は役に立ちませんが、SIGALRMが速射されなければ、そこそこ使えます。速射に対応する恒久的な手段は、sigactionになりますが、それを必要とする場合はその旨補足してください)
回答ありがとうございます。
速射の場合には役に立たないというのはどういうことになるのでしょうか?
signal()を使うのを避けてsigaction()を使ったほうが良いと書かれているのをどこかで呼んだことがあります。この2つは使い分けることになるのでしょうか。
その場合、
速射とはどの程度の速さと判断すればよろしいでしょうか?当方のsetitimerの設定は1秒ですので速射では無いでしょうが、参考までに教えてください。

No.3
- 回答日時:
>速射とはどの程度の速さと判断すればよろしいでしょうか?当方のsetitimerの設定は1秒ですので速射では無いでしょうが、参考までに教えてください。
シグナルハンドラーが呼び出されてから、シグナルハンドラーの再設定を行うときまでに、再度、シグナルが発生すると、signalを使う方法では、対処できません。
下記の例では、
void Callback(int sig)
{
・・・ここで、また、SIGALRMが発生すると、この方式では、対処不能。
signal(SIGALRM,CallBack); //これを追加
//printf文
}
上記の状態が、発生しなければ、問題ありません。
上記の状態が発生するのが、具体的に、何msecかは不明ですが、1秒なら、問題ありません。
ご回答ありがとうございます。
1秒と書きましたが、マスクをして解除されるまで十数秒かかりますので、上記の方法では問題があるようです。
sigaction()に切り替えることで問題は発生しなくなりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- Excel(エクセル) Excelで行削除をすると… 1 2023/07/26 11:57
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(プログラミング・Web制作) pythonにおける単方向リストの実装について 4 2022/07/13 12:34
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
???ダメなんです(分からないん...
-
配列を関数に渡す方法
-
while文の判定について(C言語)
-
初心者です。
-
for文の条件式について
-
”0”入力時、else文の中の”Can n...
-
初歩的な質問
-
Verilog HDLについて質問
-
プログラム 不等式
-
c言語の配列のプログラム
-
C言語 指南お願いします
-
四則演算のプログラム
-
for文
-
実行すると if文 に矛盾
-
while for/ if else/do while文...
-
十進BASICのプログラムについて
-
if-else文および標準演算子(*...
-
C言語のwhileループについて
-
printfでの計算結果がおかしく...
-
誤作動の原因を教えてください
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
C言語階乗の総和を求める
-
初心者です。for文、if文を使っ...
-
配列を関数に渡す方法
-
C言語 マスターマインドゲーム...
-
C言語 入力した数値の平均値の...
-
C言語の二分法のプログラムにつ...
-
配列を使って魔方陣
-
scanf関数を用いての加減乗除%...
-
10進数からN進数に変換するプロ...
-
c言語のwhile文を使った計算で...
-
全角文字の判定
-
C言語 数字以外を入力させない...
-
プログラミングで二番目に大き...
-
while文を使った問題なのですが...
-
getcの改行判定
-
C言語
-
c言語で平均をだす
おすすめ情報