のような信号を受信する前に、コードが偶発的な無限ループに入っているかどうかを確認するのは非常に困難です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