Question

Habituellement, lorsque je dois bifurquer en C, je fais quelque chose comme ceci:

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

Je me suis dit que je pouvais abandonner la variable supplémentaire et utiliser:

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

Gestion des erreurs incorrecte (pourquoi) est-ce que cela fonctionne / ne fonctionne pas?

Était-ce utile?

La solution

Ce que vous suggérez fonctionnera certainement. Toutefois, la gestion des erreurs n’est pas facultative dans les applications bien conçues. Le modèle d'implémentation suivant est également succinct et traite également les erreurs. De plus, il enregistre la valeur renvoyée fork () dans la variable pid, au cas où vous souhaiteriez l’utiliser plus tard dans le parent pour, par exemple, attendre l’enfant.

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

Autres conseils

Vous perdez l'ID de processus enfant dans le parent, qui est ce qui est retourné au parent. Je pense que vous pourriez récupérer cette information, mais peut-être pas uniquement (c’est-à-dire que je pourrais obtenir le PID de tous vos enfants, mais pas nécessairement le PID de l’enfant que vous venez de donner). Si vous n'avez pas besoin de connaître le NIP de l'enfant, je pense que la deuxième solution est la bonne.

De plus, -1 est renvoyé en cas d'erreur dans la conversion, que vous ne testez pas dans les deux cas, ce qui est généralement une erreur.

Vous devriez le faire à la place. Je n'ai jamais su que ça ne marcherait pas. C'est comme ça que ça se passe dans les livres de Stevens.

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

Vous êtes libre de le faire en C et cela fonctionnera car le parent et l'enfant recevront des valeurs de retour différentes de la fourchette - et celle-ci est évaluée en premier. Les seuls problèmes sont le traitement des erreurs que vous avez mentionné. En outre, vous ne pourrez pas récupérer le PID enfant au cas où vous souhaiteriez l’opérer, par exemple avec un waitpid, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top