Comment faire un fork() n enfant correctement les processus en C?
Qui est de mon code.
#include <stdio.h>
#include <stdlib.h>
int main ( int argc, char *argv[] )
{
int i, pid;
for(i = 0; i < atoi(argv[1]); i++) {
pid = fork();
if(pid < 0) {
printf("Error");
exit(1);
} else if (pid == 0) {
printf("Child (%d): %d\n", i + 1, getpid());
exit(0);
} else {
wait(NULL);
}
}
}
La sortie est comme ça.
Child (1): 5676
Child (2): 4624
Child (3): 4800
Child (4): 5596
Child (5): 5580
Cependant ce n'est pas l'attendre à la sortie de mes devoirs.
Il devrait être comme ça. Quel est le problème avec le code? Quelqu'un peut-il m'aider?
Child (2): 4625
Child (1): 4624
Child (3): 4626
Child (4): 4627
Child (5): 4628
Merci pour votre aide. Maintenant, je vais l'essayer.
P. S. Désolé mon anglais est mauvais. J'espère que vous pouvez comprendre ce que j'ai dit.
OriginalL'auteur Eric Tang | 2012-02-05
Vous devez vous connecter pour publier un commentaire.
Votre code fonctionne parfaitement sur mon ordinateur. Il peut être os à charge.
cependant, vous devez vérifier si argc n'est pas égal à 1 pour éviter les erreur de segmentation si aucun argument n'est donné à votre programme.
Oui, c'est vraiment os dépendante. J'ai testé mon programme dans l'école du serveur Linux. J'ai eu l'attendre à la sortie. Je vous remercie beaucoup.
OriginalL'auteur ClemPi
Le système prend gratuit PIDs à attribuer à des processus. Vous pouvez fourche de l'ID de processus avais 4000 et avoir un enfant ID avais 3900. Vous devoirs papier ne devrait même pas mettre des nombres, car le premier ID de processus n'est jamais le même de toute façon.
OriginalL'auteur Eregrith
Avec cette sortie attendue, très probablement, vos devoirs doivent d'abord fork tous les processus et l'appel en attente.
Il suffit de sauter l'attente d'appel dans la boucle et faire une autre en dessous qui doit être mise en boucle jusqu'à ce que
wait
retourne-1
eterrno
ensemble deECHILD
. Notez que l'ordre de sortie des enfants sera aléatoire, ou au moins pas tout à fait dans l'ordre, donc pas nécessairement 2 1 3 4 5.Ce n'est qu'une supposition bien, vous devez fournir plus d'informations si vous voulez une réponse précise.
OriginalL'auteur Per Johansson
La raison pourquoi vous obtenez une non ordonnée de sortie, c'est que vous ne peut exactement prévoir que l'enfant devient active lorsque. Donc il se peut que l'exécution de votre 1er enfant est retardé jusqu'à ce que votre 2e
fork()
ed et a commencé.Votre childs obtenir normalement séquentielle PIDs, bien que ce soit OS dépendante.
Les deux questions ne devraient pas être un problème avec votre tâche planifiée - ni absolue PIDs sont vraiment d'importance (comme l'a dit, tous les OS ne peut faire son propre truc, l'attribution PIDs de manière séquentielle ou aléatoire), ni l'ordre dans lequel les enfants font leurs trucs: chaque partie de l'enfant peut avoir différents temps d'exécution, résultant en non ordonnée de sortie. Ce compte tant que les données sont transférées correctement - ce qui est le cas si le parent génère la séquence et les fourches. Dans ce cas, le processus de l'enfant de la mémoire mise en page est la même que celle du parent au moment de la fourche. De sorte que le parent peut modifier son "transfert de données de tableau" sans affecter déjà en cours d'exécution enfants.
Pour la réduction de la confusion, vous pouvez supprimer la sortie du Pid de chaque ligne. Peut-être qu'ils peuvent être de sortie, au début du processus enfant, mais après cela, il suffit de dire par exemple
Child 3: straight length 6 <S6,H5,C4,S3,H2,SA>
sans répéter le PID.Non seulement est le pid d'affectation OS-dépendante, la planification de l'enfant processus est à l'exécution, à charge; il n'y a aucune garantie que le premier enfant fourche est le premier enfant planifiée pour s'exécuter.
Exactl qu'est ce que je veux dire avec la "première" de ma réponse, l'une mentionnant les prévisions des trucs.
Mise à jour de réponse pour l'explication.
Je vous remercie pour votre aide.
OriginalL'auteur glglgl