Exit mais sans exit
Résolu
Utilisateur anonyme
-
Lapourax Messages postés 3014 Date d'inscription Statut Contributeur Dernière intervention -
Lapourax Messages postés 3014 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour les gents !!!
comment faire pour quitter un programme C sans l'utilisation de exit(1) ou de system() ?
merci de votre future aide ;-)
comment faire pour quitter un programme C sans l'utilisation de exit(1) ou de system() ?
merci de votre future aide ;-)
A voir également:
- Le jeu a cessé de fonctionner minecraft exit code 1
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
6 réponses
Lu'
Tu peux aussi expliquer pourquoi tu veux te passer de exit :)
Sinon y'a le
->
Cdlt,
La vie est un mystère qu'il faut vivre, et non un problème à résoudre. (Gandhi, membre CCM)
La meilleure manière d'atteindre le bonheur est de le donner aux autres. (Baden-Powell, Modo)
Tu peux aussi expliquer pourquoi tu veux te passer de exit :)
Sinon y'a le
return 0;dans le main ou alors y'a barbarus maximus qui consiste à arrêter de force son propre processus
->
kill (getppid (), SIGUSR1);...
Cdlt,
La vie est un mystère qu'il faut vivre, et non un problème à résoudre. (Gandhi, membre CCM)
La meilleure manière d'atteindre le bonheur est de le donner aux autres. (Baden-Powell, Modo)
Bonjour,
Si tu ne veux absolument pas de exit() (au passage, c'est exit(EXIT_FAILURE); pour quitter avec une erreur et non exit(1);), le mieux (le plus portable en tout cas) est sans doute que toutes tes fonctions appelées depuis le main() renvoie un code erreur, et que tu traites ce code erreur dans le main() et quitte le programme avec un return EXIT_FAILURE;
Cdlt,
Google is your friend
Si tu ne veux absolument pas de exit() (au passage, c'est exit(EXIT_FAILURE); pour quitter avec une erreur et non exit(1);), le mieux (le plus portable en tout cas) est sans doute que toutes tes fonctions appelées depuis le main() renvoie un code erreur, et que tu traites ce code erreur dans le main() et quitte le programme avec un return EXIT_FAILURE;
Cdlt,
Google is your friend
Sinon tu peux utiliser cette bonne commande trop souvent délaissée : le goto !
À la fin de ton code principal (main) tu mets un label :
Et là où tu veux quitter, tu fais un
À la fin de ton code principal (main) tu mets un label :
fin:
Et là où tu veux quitter, tu fais un
goto fin;
Pourquoi utilisée à mauvais escient ? Je sais que ça ne fonctionne que dans le main je l'ai précisé, mais j'aurais dû le repréciser quand je parle de placer le goto effectivement.
Dans une fonction ce ne serait pas du tout adapté je suis d'accord ce serait vraiment l'utiliser à mauvais escient, mais dans le cas d'un main() seul ça me parait bien utilisé ?
Plutôt que de passer par du code supplémentaire (un booléen, des tests qui seront sûrement répétés si on est dans une boucle,...) ça me parait plus simple et une bonne alternative parmi d'autres pour remplacer un exit(0);
Je vois maintenant qu'en fait il demandait un exit(1), j'avais mal lu
Dans une fonction ce ne serait pas du tout adapté je suis d'accord ce serait vraiment l'utiliser à mauvais escient, mais dans le cas d'un main() seul ça me parait bien utilisé ?
Plutôt que de passer par du code supplémentaire (un booléen, des tests qui seront sûrement répétés si on est dans une boucle,...) ça me parait plus simple et une bonne alternative parmi d'autres pour remplacer un exit(0);
Je vois maintenant qu'en fait il demandait un exit(1), j'avais mal lu
Pourquoi utilisée à mauvais escient ?
Goto est à éviter autant que possible. Il vaut mieux privilégier un code bien structuré (fonction() / while / for / ...). Ainsi pour chaque ligne, tu sais d'où tu viens. Ce qui n'est pas possible avec un goto. Dans certains cas, en revanche, il est difficile de s'en passer comme pour la gestion des erreurs.
Je sais que ça ne fonctionne que dans le main je l'ai précisé,
Tu parlais du label. Mais ok. Du coup, si ça ne marche que dans le main(), autant utiliser return EXIT_FAILURE; Ou alors de fermer proprement la boucle while / for (à voir selon le code).
Goto est à éviter autant que possible. Il vaut mieux privilégier un code bien structuré (fonction() / while / for / ...). Ainsi pour chaque ligne, tu sais d'où tu viens. Ce qui n'est pas possible avec un goto. Dans certains cas, en revanche, il est difficile de s'en passer comme pour la gestion des erreurs.
Je sais que ça ne fonctionne que dans le main je l'ai précisé,
Tu parlais du label. Mais ok. Du coup, si ça ne marche que dans le main(), autant utiliser return EXIT_FAILURE; Ou alors de fermer proprement la boucle while / for (à voir selon le code).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonsoir
La solution la plus propre est celle proposer par @fiddy qui permet de faire remonter l'information afin que le système d'exploitation traite l'information comme bon lui semble mais d'un autre côté, comme ce qui a été dit plus haut , la méthode "radicalus barbarus" peut être employer c'est à dire, émettre un signal de terminaison du processus de préférence le processus père ( qui t'a faire radicalus faut le faire sur le père ) bien entendu y'a tout qui se termine.
voici un exemple qui permet d'illustrer ce que j'avance et qui regroupe un peu de tout ce qui a été dit sauf le goto.
Dans l'exemple qui suit j'emploie un thread pour le tester, j'admets que le code n'est pas propre et a revoire.
Pour ce qui est du signale on a le choix soit en utilisant TERM (15) ou SIGKILL comme dit @fiddy
à bientôt
Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
La solution la plus propre est celle proposer par @fiddy qui permet de faire remonter l'information afin que le système d'exploitation traite l'information comme bon lui semble mais d'un autre côté, comme ce qui a été dit plus haut , la méthode "radicalus barbarus" peut être employer c'est à dire, émettre un signal de terminaison du processus de préférence le processus père ( qui t'a faire radicalus faut le faire sur le père ) bien entendu y'a tout qui se termine.
voici un exemple qui permet d'illustrer ce que j'avance et qui regroupe un peu de tout ce qui a été dit sauf le goto.
Dans l'exemple qui suit j'emploie un thread pour le tester, j'admets que le code n'est pas propre et a revoire.
Pour ce qui est du signale on a le choix soit en utilisant TERM (15) ou SIGKILL comme dit @fiddy
à bientôt
include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> void f_Signal_abord( void ){ pid_t n_pid_abrt = getppid(); kill( n_pid_abrt, SIGKILL ); } void *f_my_loop( void ){ short i_cpt = 100; printf("Start....\n"); while( (0) != i_cpt ){ printf(">>\t je vais quitter à %d\n", i_cpt ); if( (15) == i_cpt ){ printf("valeur acquise je sort ?\n"); getchar(); f_Signal_abord(); } else i_cpt -= 1; } return( NULL ); } int main( void ){ pthread_t thread_t; pthread_create( &thread_t, NULL, f_my_loop, NULL ); pthread_join( &thread_t, NULL ); return( EXIT_SUCCESS ); }
Celui qui peut, agit. Celui qui ne peut pas, enseigne. Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien, et les philosophes, qui ne connaissent rien sur tout. G.B Shaw
Bah si tu fais des fork tu as plusieurs processus. Faut tous les couper si tu veu pas laisser des fantômes traîner en fond...
Seul le message d'erreur m'embete mais bon ..
Moche = non portable ?
Je teste un peut tout ce qui me tombe sous la mains donc possible que sa soit pas super ...