comment sortir d'un processus enfant - _exit() par rapport à la sortie
Considérer 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 vais-je quitter le processus de l'enfant si execvp retourne? Doit-je utiliser exit() ou _exit()?
Vous devez vous connecter pour publier un commentaire.
Vous devriez certainement utiliser
_Exit()
.exit()
appelle les fonctions que vous avez ajouté avecatexit()
et supprime les fichiers créés avectmpfile()
. Depuis le processus parent est vraiment celui qui ne veut pas de ces choses quand il existe, vous devriez appeler_Exit()
, qui n'a aucun de ces.Avis
_Exit()
avec un capital E._exit(2)
est probablement pas ce que vous voulez l'appeler directement.exit(3)
et_Exit(3)
fera appel pour vous. Si vous n'avez pas_Exit(3)
, alors oui,_exit()
est ce que tu voulais._Exit
est définie par l'implémentation. Vous ne voulez probablement pas ce comportement (concernant unflushed cours d'eau). Toutes les pages de man, j'ai vu dire que_exit
ne chasse pas les flux, de sorte qu'il est plus sûr si un fichier a unflushed contenu lors de la bifurcation se produit. Le fait que_exit
n'est pas standard C est un point discutable, commefork
est Unix spécifique trop. La norme C comité peut avoir des raisons particulières à introduire_Exit
, mais il n'y a aucune raison pour que les programmeurs Unix pour changer_exit
à_Exit
à tous. @VariableLengthCoderL'enfant de fork() doit toujours faire appel à _exit().
Appeler exit() à la place est un bon moyen de provoquer l'attente stdio tampons à être rincée deux fois.
execvp d'une sortie de l'enfant en cas de succès de sorte que vous n'avez pas à quitter.
Sur execve échec-je simplement utiliser
exit(EXIT_FAILURE);
de l'enfant.Edit : j'ai trouvé que, après quelques recherches : http://www.unixguide.net/unix/programming/1.1.3.shtml
Donc il semble qu'il est préférable d'utiliser
_exit()
dans une fourchette enfant, spécialement lorsque vous êtes en C++ :pMerci pour votre question, j'ai appris quelque chose 😀
Cela dépend du comportement que vous voulez:
man -s 3 exit
etman _exit
pour plus de détails sur votre système. En général, je crois que le _exit ne pas exécuter les fonctions qui sont enregistrés avec atexit() alors que la sortie n' (ces fonctions préférable de ne pas appeler de sortie - sinon vous avez la récursivité).En général je préfère sortie sur _exit, sauf pour les fonctions enregistrées avec atexit, dans ceux que j'appellerais les _exit, si nécessaire.
exit()
est ANSI-C de la fonction et, par conséquent, il est indépendants du système d'exploitation. Il se ferme à toutes les normes ANSI-C fonctions standard._exit()
est appelé parexit()
pour fermer dépendant du système d'exploitation fonctionnalités, parce queexit()
n'a aucune idée à leur sujet.(exit
est un système d'exploitation indépendante)