0

ctrl-c シグナルにシグナルハンドラーを使用しています。つまり、アプリケーションを終了する代わりに ctrl-c シグナルが生成されるたびに、何らかのアクションを実行します。

while(1) ループ (何らかのエラー状態) が原因でアプリケーションがハングした場合、その場合にのみアプリケーションを終了できるとしますか?

元:

void handle()
{
    /*do some action*/
    ----
    ----
    ---

    if ( while(1) detected)
    {
    exit(0);
    }
}


main()
{
    struct sigaction myhandle; 
    myhandle.sa_handler = handle;
    sigemptyset(&myhandle.sa_mask);
    myhandle.sa_flags = 0;
    sigaction(SIGINT, &myhandle, NULL);

   while(1);
}

ありがとう

4

1 に答える 1

0

のような信号を受信する前に、コードが偶発的な無限ループに入っているかどうかを確認するのは非常に困難ですCtrl-C。いくつかのヒューリスティックなアプローチを提案できます。十分に長いサイズの変数、できればグローバルunsigned long long int変数を用意し、ループの反復ごとに無限ループに陥る可能性があると思われるループ内でこの変数をインクリメントし続けます。ここで、シグナルを受信したら、シグナルハンドラーでこの変数の値をしきい値と照合しMAX_NUMBER_OF_ITERATIONSます。変数がユーザー定義のしきい値を超えた場合は、無限ループを宣言し、exitそれ以外の場合は単純に続行します。

これらの行に何か-

#define MAX_NUMBER_OF_ITERATIONS 100000000

unsigned long long checkForEndlessLoop=0;
bool overflow;

void sigHandler (int signum)
{
   signal(sig, SIG_IGN); // Ignore it so that another Ctrl-C doesn't appear any soon
   if (overflow || (checkForEndlessLoop > MAX_NUMBER_OF_ITERATIONS) )
   {
      //Something's fishy in the loop.
      exit(0);
   }
   else
   {
      signal(SIGINT, sigHandler );
   }
}

int main ()
{
   signal(SIGINT, sigHandler );

   for (checkForEndlessLoop=0; SOME_SLOPPY_CONDITION; )
   {
      //Some processing here
      if (++checkForEndlessLoop == 0 )
          overflow=true;
   }

   checkForEndlessLoop=0;

   while (SOME_SLOPPY_CONDITION)
   {
      //Some processing here
      if (++checkForEndlessLoop == 0 )
          overflow=true;
   }

}

または、さらに簡単なのは、障害状態が検出されたらすぐに障害ループのSIGINT使用SIG_IGNと終了を無視し、エラーメッセージを出力して終了することです。break

于 2012-04-20T09:40:43.723 に答える