Il est très difficile de trouver si votre code est dans une boucle infinie accidentelle avant de recevoir un signal comme Ctrl-C
. Je peux suggérer quelques approches heuristiques. Avoir une variable de taille suffisamment longue, de préférence un unsigned long long int
global, et continuer à incrémenter cette variable à l'intérieur des boucles que vous suspectez de glisser dans des boucles infinies à chaque itération de la boucle. Maintenant, lorsque vous recevez un signal, vérifiez la valeur de cette variable dans le gestionnaire de signal par rapport à un seuil MAX_NUMBER_OF_ITERATIONS
. Si la variable dépasse le seuil défini par l'utilisateur, déclarez alors une boucle infinie et exit
sinon continuez simplement.
Quelque chose sur ces lignes-
#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;
}
}
Ou encore plus simple est, simplement ignorer l'SIGINT
en utilisant SIG_IGN
et break
hors de la boucle défectueuse dès que la condition défectueuse est détectée, imprimer un message d'erreur et Sortie!
1) La déclaration/définition/signature pour votre gestionnaire de signal est erronée, elle devrait être 'handle vide (int signum);' 2: recherche 'man 2 siglongjmp' – wildplasser