Francois-Xavier KOWALSKI wrote:
>
> >>>>> "Francois" == Francois CAU <Francois.CAU@???> writes:
>
> Francois> En regle generale:
> Francois> - main() est toujours de type int
> Francois> - exit(code) est utilise pour remonter un code d'erreur au
> Francois> programme appelant (shell).
>
> Francois> Si quelqu'un a plus d'explications theoriques...
>
> Inexact: On peut très bien avoir le prototype suivant:
>
> void main(int argc, char *argv[]);
>
[...]
>
> Autrement, exit() étant une fonction de la librairie standard, je
> suppose qu'elle fait naturellement un peu de ménage avant de sortir
> (type libérer le tas de mémoire & fermer les descripteurs de fichiers
> ouvert, ... etc).
>
> Mon conseil: exit(errno);
>
> A+.
> Fix.
oui exit() appelle les fonctions enregistrees par atexit() et fait le menage.
Il y a une autre fonction, _exit(), qui retourne directement au kernel.
D'apres le bouquin sur lequel je viens de verifier, quand main() sort sur
un return, exit() est appelee, donc je ne vois pas bien la difference
entre return value; et exit(value);
Par contre j'eviterais le "void main(int argc, char *argv[]);"
qui est syntaxiquement legal, mais correspond a un statut de retour non defini.
>
> Footnotes:
>
> [1] En ce qui concerne le traitement du code de retour, il n'est
> disponible pour un process parent que si le process enfant a été
> lancé en synchrone (sans "&" dans le cas d'une commande system(),
> ou sans fork() en éxécution directe).
>
> Sinon, ouvrir un descripteur de fichier commun (cf. pipe())
> semble être la manière la plus simple d'échanger des infos.
>
Cela me semble faux : il y a des fonctions pour recuperer le
statut de processus asynchrones : wait(), waitpid()
Eric