web-dev-qa-db-fra.com

comment quitter un processus enfant - _exit () vs exit

Considérez cet extrait de code:

pid_t cpid = fork();

if (cpid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
}

if (cpid == 0) { // in child
    execvp(argv[1], argv + 1);
    perror("execvp");
    _exit(EXIT_FAILURE);
}

// in parent

Comment dois-je quitter le processus enfant si execvp revient? Dois-je utiliser exit () ou _exit ()?

42
helpermethod

Vous devez absolument utiliser _Exit(). exit() appelle les fonctions que vous avez ajoutées avec atexit() et supprime les fichiers créés avec tmpfile(). Etant donné que le processus parent est vraiment celui qui veut que ces choses soient faites quand il existe, vous devriez appeler _Exit(), ce qui ne fait rien de tout cela.

Remarquez _Exit() avec un E. majuscule. _exit(2) n’est probablement pas ce que vous voulez appeler directement. exit(3) et _Exit(3) appellent cela pour vous. Si vous n'avez pas _Exit(3), alors oui, _exit() est ce que vous vouliez.

47
Variable Length Coder

L'enfant de fork () doit toujours appeler _exit ().

Appeler exit () est un bon moyen de vider deux fois les tampons stdio en attente.

15
Joshua

execvp va quitter l'enfant s'il réussit, vous n'avez donc pas besoin de quitter.

En cas d’échec, j’utilise simplement exit(EXIT_FAILURE); dans l’enfant.

Edit: j'ai trouvé qu'après quelques recherches: http://www.unixguide.net/unix/programming/1.1.3.shtml

On dirait donc qu'il vaut mieux utiliser _exit() dans un enfant fork spécialement lorsque vous êtes en C++: p .__ Merci pour votre question, j'ai appris quelque chose: D

3
Nicolas Guillaume

Cela dépend du comportement souhaité: man -s 3 exit et man _exit pour plus de détails sur votre système. En général, je pense que _exit n'exécute pas les fonctions enregistrées avec atexit () alors que exit fonctionne (ces fonctions ne doivent pas appeler exit, sinon vous obtenez une récursion).

En général, je préférerais quitter plutôt que quitter sauf dans les fonctions enregistrées avec atexit, dans celles que j'appellerais _exit, si nécessaire.

1
jabbie

exit() est une fonction ANSI-C et est donc indépendant du système d'exploitation. Elle ferme toutes les fonctions standard ANSI-C ._exit() est appelé par exit() pour fermer les fonctionnalités dépendant du système d'exploitation, car exit() n'en a aucune idée. (exit est indépendant du système d'exploitation)

0
ImanKh