2

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フレームがまだ存在します。これは、スペースが不足してセグメンテーション違反がスローされるまで、繰り返し発生し続けます。

やりたいことをするデザインを考えてみましたが、信号がトリガーされた後のコードフローを視覚化できません。
私が説明したことを実装する正しい方法は何ですか?

4

2 に答える 2

0

リストした変更の再評価:

- Set an alarm
- Enter while loop
- Read counter when we get SIGALRM
- Increment iteration_index
- If iteration_index < iterations: call main_loop
- Else exit

一連のキーストロークを提供することができます (たとえば、ユーザーが<ctrl> - 1 回数を (1 回だけ) 指定できるようにするため) GetAsyncKeys()。、プログラムは、アラームを鳴らす時間を指定してプロンプトを表示し、プログラムはその回数の繰り返しを実行してから終了します..<ctrl> 1<ctrl> 1

#include <stdio.h>
#include <windows.h>

void set_alarm(void);

int main(void) {
int iterations=-1, counter=0;
    while (iterations != counter) 
    {
        if(iterations == -1)//code will run forever if iteration is not set by user
        {

            set_alarm(); 
            counter++;
            if (GetAsyncKeyState(VK_CONTROL)<0) 
            {

                if (GetAsyncKeyState('1')<0) 
                {
                    printf("Enter how many time alarm should activate:\n");
                    scanf("%d", &iterations);
                    counter = 0;
                    Sleep(10);
                }
            }
        }
        else//this block will monitor alarm count, program quits when limit reached.
        {
            if(counter < iterations)
            {
                set_alarm();
                counter++;
            }

        }
        Sleep(10);//changed here for my test, you might need to change again
    }

    return 0;
}

void set_alarm(void)
{
    //do something; 
}
于 2013-11-01T19:35:12.573 に答える