web-dev-qa-db-fra.com

Comment puis-je fermer immédiatement un programme en C?

J'écris du code C dans lequel j'analyse des données. J'ai configuré le programme pour gérer seulement 100 entrées de données. Quand il a plus de 100 entrées, cela donne un défaut de segmentation. Je veux créer un moyen pour que lorsque le nombre d'entrées soit supérieur à 100, l'utilisateur soit averti et le programme se termine. Je sais comment le faire à partir de la fonction principale simplement par return 0; cependant, je suis à plusieurs appels de fonction et il est difficile de le faire, même un return 0 dans cette fonction le gardera en boucle.

Existe-t-il un moyen immédiat de mettre fin au programme dans son intégralité sans être en position principale?

19
Syntax_Error

La fonction standard exit est ce que vous recherchez:

Termine le processus normalement, en effectuant le nettoyage régulier des processus en cours.

Premièrement, toutes les fonctions enregistrées par les appels à atexit sont exécutées dans l’ordre inverse de leur enregistrement. Ensuite, tous les flux sont fermés et les fichiers temporaires supprimés, puis le contrôle est renvoyé à l'environnement hôte.

L'argument status est renvoyé à l'environnement hôte.

Ce serait mieux si vous corrigiez l’erreur de segmentation.

36
K-ballo

Vous devez inclure la bibliothèque standard et vous pourrez ensuite appeler exit où vous le souhaitez:

#include <stdlib.h>
...
exit(status);

où status est un entier représentant le code de sortie . Pour quel statut de préoccupation: si la convention est 0, les autres valeurs indiquent un statut d'erreur.

5
Heisenbug

Vous pouvez également fprintf(stderr, ....) puis appeler abort(); cela peut être utile si vous voulez déboguer votre bogue plus tard.

Mais je crois que vous devriez recoder votre programme pour que les limitations de taille ne soient données que par les ressources disponibles: donc si vous exécutez votre programme sur un ordinateur beaucoup plus grand cela signifie) il pourrait traiter plus de 100 entrées.

2

Une meilleure solution consiste peut-être à résoudre le problème de segmentation avec un gestionnaire de signaux et à demander au gestionnaire de signaux de générer un signal SIGSTOP.

De cette façon, votre programme s’arrête, mais reste en mémoire. Vous pouvez ensuite vous y attacher avec un débogueur et voir le programme figé dans sa gloire au point où SEGFAULT est arrivé. 

Cela peut être utile pour rechercher des problèmes dans les programmes de longue durée que vous n'exécutez pas dans un environnement de développement intégré.

1
bazza