2011-10-01 2 views
0

J'essaie d'avoir un programme qui utilise plusieurs fourchettes.
J'ai utilisé cet exemple pour me faire commencer Multiple fork() ConcurrencyExemple d'une fourchette multiple en C

il fonctionne parfaitement comme il est. Toutefois, lorsque j'essaie d'ajouter une instruction d'impression dans l'enfant comme ceci:

if ((p = fork()) == 0) { 
      // Child process: do your work here 
     printf("child %i\n", ii); 
      exit(0); 
     } 

Le processus ne se termine jamais. Comment puis-je faire des choses dans l'enfant et amener le parent à terminer l'exécution du programme?

+0

ce qui arrive à vos processus? Voyez-vous une sortie? –

+0

Vous devez montrer plus de code que vous avez; le problème n'est pas dans ce que vous nous montrez. On ne sait pas très bien à quoi sert "ii". Vous pouvez envisager d'utiliser 'getpid()' pour imprimer l'ID du processus. (Je peux imaginer des façons dont 'ii' n'est pas incrémenté dans le processus parent si nécessaire, par exemple.) –

+0

N'appelez pas' exit' dans l'enfant. Utilisez '_exit'. Sinon, l'enfant peut vider et nettoyer les ressources qui sont encore utilisées dans le parent. Cela peut, par exemple, modifier la position actuelle des descripteurs de fichiers utilisés par le parent, ce qui peut entraîner une corruption des données. –

Répondre

3

Dans votre exemple de code

if (waitpid(childPids[ii], NULL, WNOHANG) == 0) { 

devrait être

if (waitpid(childPids[ii], NULL, WNOHANG) == childPids[ii]) { 

en raison de

waitpid(): en cas de succès, renvoie l'ID de l'enfant dont l'état de processus a changé ; en cas d'erreur, -1 est renvoyé; si WNOHANG a été spécifié et qu'aucun enfant (ren) spécifié par pid n'a encore changé d'état, alors 0 est retourné.

Référence: http://linux.die.net/man/2/waitpid

+0

Merci, cela a fonctionné, et le lien est utile – richsoni