SIGALRM
現在、無限ループから抜け出すためにアラーム信号を使用しています。
私のコードは次のように構成されています
main_loop() {
set_alarm();
while(1)
counter++;
}
ロジックは次のとおりです
-アラームを設定
します-whileループに入ります
-取得時にカウンターを読み取りますSIGALRM
実行されるコードをSIGALRM
以下に示します。
VERBOSE("Cycles :%u\n", counter);
iteration_index++;
if(iteration_index == iterations)
exit(0);
counter = 0;
main_loop();
iterations
ここで、アラームを鳴らす回数 ( ) を指定するオプションをユーザーに提供したいと思います。つまり、上記のロジックを次のように変更します。
- アラームを設定する
- while ループに入る -
取得時にカウンターを読み取るSIGALRM
- インクリメントiteration_index
- If iteration_index < iterations
: 呼び出しmain_loop
- Else 終了
上記のロジックを実装したところ、数千回の反復後に segfault が発生することがわかりました。この理由は次
のとおりだと思います。アラームがトリガーされ、新しい呼び出しが行われるmain_loop
と、元のmain_loop
フレームがまだ存在します。これは、スペースが不足してセグメンテーション違反がスローされるまで、繰り返し発生し続けます。
やりたいことをするデザインを考えてみましたが、信号がトリガーされた後のコードフローを視覚化できません。
私が説明したことを実装する正しい方法は何ですか?