Exit mais sans exit
Résolu/Fermé
Utilisateur anonyme
-
13 mai 2015 à 10:54
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 - 20 mai 2015 à 09:35
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 - 20 mai 2015 à 09:35
6 réponses
Lapourax
Messages postés
3006
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
17 février 2023
334
Modifié par Lapourax le 13/05/2015 à 11:03
Modifié par Lapourax le 13/05/2015 à 11:03
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)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
Modifié par fiddy le 13/05/2015 à 12:01
Modifié par fiddy le 13/05/2015 à 12:01
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 mai 2015 à 13:45
18 mai 2015 à 13:45
Pour utiliser EXIT_FAILURE, il faut inclure stdlib.h.
Ensuite, return EXIT_FAILURE; est à appeler depuis le main().
Non cela ne gère pas les processus fils puisqu'ils sont indépendants... Mais tu peux leur envoyer un signal pour les fermer (SIGKILL par exemple).
Ensuite, return EXIT_FAILURE; est à appeler depuis le main().
Non cela ne gère pas les processus fils puisqu'ils sont indépendants... Mais tu peux leur envoyer un signal pour les fermer (SIGKILL par exemple).
Lapourax
Messages postés
3006
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
17 février 2023
334
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
18 mai 2015 à 14:18
18 mai 2015 à 14:18
+1 :)
Timmydu26
Messages postés
80
Date d'inscription
mercredi 29 avril 2015
Statut
Membre
Dernière intervention
17 juin 2016
30
13 mai 2015 à 10:58
13 mai 2015 à 10:58
C'est à dire? Peut tu donner un exemple de l'endroit ou tu veut quittez ton programme?
Cloturernapasdesensfigure
Messages postés
111
Date d'inscription
vendredi 6 février 2015
Statut
Membre
Dernière intervention
22 juin 2016
5
13 mai 2015 à 11:25
13 mai 2015 à 11:25
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;
Lapourax
Messages postés
3006
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
17 février 2023
334
13 mai 2015 à 11:49
13 mai 2015 à 11:49
Raaaah c'est moche les gotooooo... Mais ça marche c'est sur :)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
13 mai 2015 à 11:58
13 mai 2015 à 11:58
Trop souvent délaissée ? Trop utilisé et à mauvais escient comme ici.
Car non seulement, ta solution ne fonctionne que dans le main. Et elle peut-être remplacée aisément (comme souvent) par un bon algorithme (au pire, y'a le break;).
Car non seulement, ta solution ne fonctionne que dans le main. Et elle peut-être remplacée aisément (comme souvent) par un bon algorithme (au pire, y'a le break;).
Cloturernapasdesensfigure
Messages postés
111
Date d'inscription
vendredi 6 février 2015
Statut
Membre
Dernière intervention
22 juin 2016
5
Modifié par Cloturernapasdesensfigure le 13/05/2015 à 12:56
Modifié par Cloturernapasdesensfigure le 13/05/2015 à 12:56
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
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
Cloturernapasdesensfigure
Messages postés
111
Date d'inscription
vendredi 6 février 2015
Statut
Membre
Dernière intervention
22 juin 2016
13 mai 2015 à 14:35
13 mai 2015 à 14:35
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).
Lapourax
Messages postés
3006
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
17 février 2023
334
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
Modifié par Lapourax le 13/05/2015 à 14:48
Modifié par Lapourax le 13/05/2015 à 14:48
Sans compter que si tu dois refiler le code à quelqu'un d'autre un jour c'est quand même vachement plus clair comme ça
C'est important un code structuré :)
C'est important un code structuré :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
Modifié par sambia39 le 20/05/2015 à 00:12
Modifié par sambia39 le 20/05/2015 à 00:12
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
13 mai 2015 à 11:04
17 mai 2015 à 20:17
18 mai 2015 à 10:16
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...
18 mai 2015 à 12:25
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 ...