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
Bonjour les gents !!!

comment faire pour quitter un programme C sans l'utilisation de exit(1) ou de system() ?

merci de votre future aide ;-)

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
Lu'

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)
1
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:04
A modifier bien sur si tu gère des arborescences de proccess (fork ou autre)
0
Astrocurieux
17 mai 2015 à 20:17
Merci ! Je Vote pour maximus barbarus ;) ça me plait bien comme manipe . Peut tu m'en dire plus par rapport a l'arborescence via fork ?
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334 > Astrocurieux
18 mai 2015 à 10:16
dieu du ciel je pensais pas que tu prendrai cette solution là... ça va être très moche.

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...
0
Utilisateur anonyme
18 mai 2015 à 12:25
Sa fonctionne bien ...
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 ...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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
1
Astrocurieux
17 mai 2015 à 20:21
Merci fiddy ;-) je garde sa sous le coude si la methode de Lapourax ne convient pas .
0
Utilisateur anonyme
18 mai 2015 à 12:33
Le return(EXIT_FAILURE) ne quitte pas mon programme

Mon but est , si exit est taper au clavier ma fonction exit le programme.
Mais EXIT_FAILURE doit peut etre etre declaré dans mon header ?
Es que sa gere les process fils egalement ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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).
0
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
+1 :)
0
Utilisateur anonyme
19 mai 2015 à 12:31
merci de vos conseils je vais voir ce que je peut faire alors !
je laisse le sujet en non résolut pour le moment .
0
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
C'est à dire? Peut tu donner un exemple de l'endroit ou tu veut quittez ton programme?
0
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
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 :
fin:


Et là où tu veux quitter, tu fais un
goto fin;
0
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
Raaaah c'est moche les gotooooo... Mais ça marche c'est sur :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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;).
0
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
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > 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
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).
0
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
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é :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Astrocurieux
17 mai 2015 à 20:26
Merci beaucoup tout le monde pour votre contribution c'est super !
0
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
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

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
0