OVH Cloud OVH Cloud

quel interet d'exit()

28 réponses
Avatar
tournevice
salut
Je me demande quel est l'interet d'appeler la fonction exit() plutot que
return.
Par exemple, si j'ai le programme suivant:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
(void) printf("salut\n") ;
return EXIT_SUCCESS ;
}

et celui-ci:

int main(void)
{
(void) printf("salut\n") ;
exit(EXIT_SUCCESS) ;
}
Qu'est-ce que ca change? Je comprend pas tres bien...si quelqu'un peut
m'eclairer. :)
did
--
Toutes des ingrates...
http://www.netbsd.org/fr
http://www.isty-info.uvsq.fr/~rumeau/fclc/

10 réponses

1 2 3
Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Jean-Marc Bourguet wrote:

Personellement, j'utilise exit() dans mon 'ASSERT()' maison, qui
permet une sortie plus propre que le assert() standard sur ma
plateforme de debug.


Si une assertion est fausse, comment peux-tu t'assurer que les
pre-conditions des fonctions enregistrees avec atexit sont vraies?


Déjà, il ne peut y avoir qu'une seule fonction enregistrée avec atexit() à la
fois. (Par défaut, il n'y en a pas).

Ensuite, tu veux dire quoi ? Qu'on ne peut pas mettre de ASSERT() dans cette
fonction sous peine de récursion infinie? C'est possible, mais comme c'est
déjà une sortie de secours, ça ne devrait pas trop géner.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Horst Kraemer wrote:

C'est un vieu astuce qui garantit que


une vieille!

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Laurent Wacrenier <lwa@ teaser . fr> wrote:

Personellement, j'utilise exit() dans mon 'ASSERT()' maison, qui permet
une sortie plus propre que le assert() standard sur ma plateforme de
debug.


abort() n'est pas plus approprié ?


Sur ma plateforme de debug (BC 3.1 sous DOS), un assert() appelle abort().
Problème, les fichiers ne sont pas fermés, la mémoire n'est pas libérée.
Plantage de BC (voire, du PC) au bout de quelques sorties brutales. Je n'ai
pas ce problème avec exit().

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Jean-Marc Bourguet
Emmanuel Delahaye writes:

In 'fr.comp.lang.c', Jean-Marc Bourguet wrote:

Personellement, j'utilise exit() dans mon 'ASSERT()' maison, qui
permet une sortie plus propre que le assert() standard sur ma
plateforme de debug.


Si une assertion est fausse, comment peux-tu t'assurer que les
pre-conditions des fonctions enregistrees avec atexit sont vraies?


Déjà, il ne peut y avoir qu'une seule fonction enregistrée avec
atexit() à la fois.


Il me semblait que la norme imposait un minimum de 32 (et il y a des
environnements ou la seule limite c'est la memoire disponible).

(Par défaut, il n'y en a pas).


D'accord. Sauf que je ne sais pas ce que font les bibliotheques que
j'utilise.

Ensuite, tu veux dire quoi ?


Que si un assert echoue, tu ne sais pas pourquoi et que les structures
de donnees internes dont dependent les fonctions enregistrees avec
atexit peuvent etre corrompues,...

Le meilleur recours en cas d'incoherence dans la majorite des cas (*),
c'est l'arret immediat -- eventuellement en loggant le probleme --
sans essayer de remettre de l'ordre ce qui peut faire plus de mal que
de bien (cad que le bien qu'on peut faire est minime et le mal tres
eleve bien que la proba du bien soit superieure a la proba du mal,
l'esperance est negative). La seule chose admissible c'est de rendre
des ressources au systeme quand il ne peut pas les recuperer tout seul
et on ne peut pas compter sur ce qui est enregistre par atexit pour se
limiter a ca.

(*) dans l'embarque on peut parfois mieux faire -- passer au systeme
de secours ou redemarrer tout le systeme sont les premieres
possibilites qui viennent a l'esprit --, je n'exclus pas des cas ou
exit soit adapte mais en faire une polique generale...

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Bertrand Mollinier Toublet
Vincent Lefevre wrote:
Dans l'article <bfgtf4$emri6$,
Bertrand Mollinier Toublet écrit:


Alors d'accord, c'est une super vieille architecture, c'est plus
vraiment utilise (meme les applis embarques utilisent des PowerPC et
autres SPARCs maintenant), mais que ++i produise du code plus rapide
que i++ c'est pas n'importe quoi. C'est juste vieux et perime.



++i produit du code plus rapide sur *une* machine particulière.
Sur une autre machine avec un compilo aussi mauvais, ça peut être
l'inverse. Maintenant, si c'est juste pour aller plus rapide sur
une machine particulière avec de telles trivialités, je te
conseillerais de programmer en assembleur.

C'est pas ce que je voulais dire. J'avais compris que tu considerais

l'idee que l'on raconte que "++i est plus rapide que i++" comme
"n'importe quoi". Je faisais remarquer que je ne suis pas d'accord dans
la mesure ou ca a un fondement historique (d'ou, ce n'est pas "n'importe
quoi", c'est juste "vieux et perime").

Cela dit, en tant que tel, "vieux et perime", l'idee doit en effet etre
oubliee, et l'on doit considerer qu'un compilateur decent sur une
architecture courante va traiter au mieux les deux ecritures.

--
Bertrand Mollinier Toublet
"Reality exists" - Richard Heathfield, 1 July 2003


Avatar
Vincent Lefevre
Dans l'article ,
Emmanuel Delahaye écrit:

In 'fr.comp.lang.c', Laurent Wacrenier <lwa@ teaser . fr> wrote:
abort() n'est pas plus approprié ?


Sur ma plateforme de debug (BC 3.1 sous DOS), un assert() appelle abort().
Problème, les fichiers ne sont pas fermés, la mémoire n'est pas libérée.
Plantage de BC (voire, du PC) au bout de quelques sorties brutales. Je n'ai
pas ce problème avec exit().


Mauvais OS (si on peut appeler ça un OS), changer d'OS. :)

--
Vincent Lefèvre - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


Avatar
Manu
Emmanuel Delahaye wrote:

A cause du 0, ce n'est pas une boucle, mais un bloc, sauf qu'il permet à la
macro de garder une sémantique 'instruction', c'est à dire avec un ';'
obligatoire.



C'est cool ça m'a permis de corriger une macro qui par chance n'était
jamais suivi de 'else'.

En fait, cette macro ne comportant qu'une ligne, on aurait pu faire
l'économie du do-while(0)

#ifndef NDEBUG
#define ASSERT(a)
(a) ? (void)0 : SYS_assertfail (#a
, __FILE__
, __LINE__
)
#else
#define ASSERT(a) ((void)0)
#endif



Si je ne m'abuse il faudrait mettre des parenthèses autour...

De même la construction (a)?b:c est-elle vraiment plus rapide qu'un
if-else avec les compilateurs actuels faisant de l'optimisation ?



Qui a parlé de plus rapide? C'est une construction comme une autre. J'ai
trouvé que sa compacité était adaptée à la situtation.


C'est plus compact mais je trouve le (void)0 relativement peu "lisible".
Enfin c'est perso.

C'est possible sur certaines implémémentations, mais je pense que quand on
apprend le C (tu as parlé de 'prof'), ce genre de détail n'est pas important.

Si à la suite d'un profiling /sérieux/, on en déduit qu'une portion du code
doit être optimisée, ce genre de considération peut éventuellement être prise
en compte. Mais avant, il faut avoir épuisé le possibilités d'optimisation du
compilateur.


D'ailleurs avec GCC 2.95.3, le code produit est rigouresement le même
avec ou sans optimisation. De même que si on remplace :
(a) ? (void)0 : SYS_assertfail (#a
, __FILE__
, __LINE__
)
par:
if(!(a))
SYS_assertfail (#a
, __FILE__
, __LINE__
)

C'est pas très interessant à savoir mais c'est rassurant :)

-=( manu )=-


Avatar
Eddahbi Karim

Malheureusement, Borland C 3.1 (qui est né avant Linux) ne sait pas tourner
sous un autre environnement, et je ne connais pas d'IDE aussi pratique et
productif que celui ci. (Les clickodromes me fatiguent)


Pour l'instant le mien il me va :D.
Tout ce que je fais c'est CTRL+S, F10, F9 et F3 pour tester mon code.

(Tant de fonctions alors que j'en demande si peu :)).
Sinon, t'as emacs sous bash avec Linux.
Par contre faut le personnaliser :/.

Voila,
ThE_TemPLaR

Avatar
Gabriel Dos Reis
Manu writes:

| C'est plus compact mais je trouve le (void)0 relativement peu "lisible".

C'est du C.

-- Gaby
Avatar
Antoine Leca
Emmanuel Delahaye écrivit:
La raison est que si j'utilise l'assert() d'origine, celui-ci appelle
abort()

et que dans ce cas les fichiers ne sont pas fermés et la mémoire n'est pas
libérée, alors qu'avec la fonction exit(), tout se passe bien, au moins
sur

ce plan là.


/* dans main() */
#ifdef DEBOGUANT
signal(SIGABORT, el_meu_abort);
#endif

/* ... */

void el_meu_abort(int) {

/* ... */
exit(EXIT_FAILURE);
}


Antoine

1 2 3