2008-09-25 8 views
3

En général, quand je dois fourchette dans C, je fais quelque chose comme ceci:fork() comme argument

pid_t p = fork(); 
if(p == 0) { /* do child stuff */ } 
else { /* do parent stuff and pray there wasn't an error */ } 

Il me est produit que je pouvais fossé la variable supplémentaire et utilisation:

if(fork() == 0) { /* child */ } 
else { /* parent/pray */ } 

Mauvaise gestion des erreurs mis à part, (pourquoi) cela fonctionne-t-il/ne fonctionne-t-il pas?

Répondre

20

Ce que vous suggérez fonctionnera certainement. Cependant, la gestion des erreurs n'est pas facultative dans toute application bien conduite. Le modèle d'implémentation suivant est également succinct et gère également les erreurs. En outre, il enregistre la valeur de retour fork() dans la variable pid, au cas où vous voudriez l'utiliser plus tard dans le parent pour, disons, attendre l'enfant.

switch (pid = fork()) { 
case -1:  /* Failure */ 
    /* ... */ 
case 0:  /* Child */ 
    /* ... */ 
default:  /* Parent */ 
    /* ... */ 
} 
4

Vous perdez l'ID du processus enfant dans le parent, qui est renvoyé au parent. Je pense que vous pourriez récupérer cette information, mais peut-être pas uniquement (c'est-à-dire, je pense que vous pourriez obtenir le PID de tous vos enfants, mais pas nécessairement le PID de l'enfant que vous venez de bifurquer). Si vous n'avez pas besoin de connaître le PID de l'enfant, je pense que la deuxième façon est bien.

De même, -1 est renvoyé s'il existe une erreur de forking, que vous ne testez pas dans les deux cas, ce qui est généralement une erreur.

2

Vous devriez le faire à la place. Je ne l'ai jamais su pour ne pas travailler. C'est comme ça dans les livres de Stevens.

int p; 
if((p = fork()) == 0) { /* child */ } 
else { /* parent/pray */ } 
1

Vous êtes libre de le faire en C et il fonctionnera parce que le parent et l'enfant recevront des valeurs de retour de la fourche - et il est évalué en premier. Les seuls problèmes sont la gestion des erreurs comme vous l'avez mentionné. De plus, vous n'aurez pas d'autre moyen de récupérer le PID de l'enfant au cas où vous voudriez opérer dessus, par exemple avec un waitpid, etc.

Questions connexes