la sortie d'un processus enfant (c)
Considérer cet extrait de code:
void do_child(void);
int main(void){
int n;
pid_t child;
printf("Write a number: ");
scanf("%d", &n);
if(n != 1){
exit(1);
}
child = fork();
if(child >= 0){ /* fork ok */
if(child == 0){
printf("Child pid: %d\n", getpid());
do_child();
_exit(0);
}
else{ /* parent */
printf("Child parent: %d\n", getpid());
_exit(0);
}
}
else{ /* fallito */
perror("No fork");
return 1;
}
return EXIT_SUCCESS;
}
void do_child(void){
/* some code here */
if(1 != 1){
/* what to write here?? _exit or exit*/
}
}
Lors de la sortie d'un processus enfant il est préférable d'écrire _exit
au lieu de exit
mais si j'ai besoin d'appeler une fonction externe et dans cette fonction, je veux mettre une sortie, que dois-je écrire? _exit
ou exit
?
Chaque processus est quelqu'un de l'enfant (à l'exception du processus avec l'id 1), n'a pas de sens pour le choix
Qui a dit que "c'est mieux d'écrire
unixguide.net/unix/programming/1.1.3.shtml
Cette page est trompé sur tout.
cela dépend beaucoup de la destructeurs eux-mêmes. E. g. si un destructeur nettoie un fichier temporaire ou autrement détruit une ressource utilisée par les autres processus, l'exécution de ces prématurément, pourrait être mauvais en effet. Le noyau peut nettoyer des trucs comme des descripteurs de fichiers peuvent très bien
_exit
sur exit
sur cette base.Qui a dit que "c'est mieux d'écrire
_exit
au lieu de exit
"?unixguide.net/unix/programming/1.1.3.shtml
Cette page est trompé sur tout.
cela dépend beaucoup de la destructeurs eux-mêmes. E. g. si un destructeur nettoie un fichier temporaire ou autrement détruit une ressource utilisée par les autres processus, l'exécution de ces prématurément, pourrait être mauvais en effet. Le noyau peut nettoyer des trucs comme des descripteurs de fichiers peuvent très bien
_exit
sans avoir besoin de les destructeurs pour que.OriginalL'auteur polslinux | 2012-09-02
Vous devez vous connecter pour publier un commentaire.
Vous pouvez vous attendre
exit
pour appeler les fonctions enregistrées avecatexit
._exit
ne le ferai pas. Normalement, chaque inscrit de nettoyage gestionnaire doit être exécutée qu'une seule fois, généralement dans le processus dans lequel elle a été enregistrée. Cela signifie qu'un processus enfant doit_exit()
et le parent doiventexit()
. Si le processus de l'enfant neexec
un autre programme, ce qui est probablement le cas le plus fréquent, alors que le nouveau programme permettra de remplacer tous les gestionnaires inscrits, ce qui signifie que vous êtes de retour à laexit()
.De fonctions externes: je dirais que vous devriez appeler
exit
mais vous devez être prêt à rencontrer d'étranges comportements si le parent inscrit non négligeable des trucsatexit
avant de faire de la fourche. Donc, essayez de fourche début, sauf si vous voulez dire àexec
de l'enfant. Et avoir un œil sur ce que la sortie des gestionnaires de votre propre code et les bibliothèques que vous utilisez pourrait installer. I/O tampon de rinçage en est un exemple.OriginalL'auteur MvG
exit()
se termine après le nettoyage alors que_exit()
termine immédiatement.Je dirais que, dans des circonstances normales,
exit()
est la bonne approche, mais je suis sûr que vous comprenez ce que vous faites si vous avez choisi_exit()
?!Je vais citer MSDN en ligne comme il est dans mes favoris 🙂
Ummm... ressemble, j'ai été très chanceux au fil des années, comme je l'ai rarement (voire jamais) utilisation _exit () et je n'ai pas remarqué les problèmes qu'il suggère!
OriginalL'auteur Andrew