Comment créer un certain nombre d'enfants de processus avec fork()
J'ai besoin de créer un certain nombre de connexions simultanées processus enfant. Je tiens aussi à chaque enfant de processus pour modifier une variable globale, de sorte que le principal processus parent peut l'imprimer dans sa dernière version modifiée. Quand je lance le programme ci-dessous, la valeur de " k " sera de 5, de sorte que la variable globale ne change pas. Si je supprime le "exit(0)", puis la variable globale changements, mais cette fois le nombre de processus fils créé devient plus grande.
Avec fork(), comment pourrais-je créer un X nombre de processus enfants qui peuvent modifier les données (variables globales, variables locales, etc) dans le processus parent?
int k = 5; //global variable
int main(){
int i=0;
int status;
for(i = 0; i<5; i++){
if(fork() == 0){
printf("child %d %d\n", i, ++k);
sleep(5);
printf("done %d\n",i);
exit(0);
}
}
return 0;
}
Ouais, mais k sera de 5 au lieu de 10. C'est ça le problème.
"enfant de processus pour modifier une variable globale" qui n'est pas la voie à fourche fonctionne, je suppose que c'est 'threads' vous plutôt souhaitez créer
Si votre problème n'est pas "Comment créer un certain nombre d'enfants de processus avec fork()", mais en fait "Comment permettre à l'enfant de processus pour modifier parent état du processus avec fork()". Est-ce que son précis?
Les deux! Mais je suis plus préoccupé par ce dernier. Ce que j'ai vraiment besoin de faire est d'appeler execvp() plusieurs fois. Si je ne peux pas passer un tableau défini à l'échelle mondiale dans le programme principal, alors je suppose que j'ai besoin pour déterminer le contenu de celle-ci après la boucle for en-tête et de passer le tableau de execvp() dans chaque bloc if.
OriginalL'auteur user246392 | 2011-02-16
Vous devez vous connecter pour publier un commentaire.
Que Kevin a commenté, ce que vous voulez vraiment est threads.
Faire de la CIB pour c'est exagéré.
Regardez le lien suivant.
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
OriginalL'auteur user606723
Vous ne pouvez pas le faire de cette manière. Fourche de créer un nouveau processus, qui va copier (ou copy-on-write) les pages de mémoire dans le nouveau processus. Cela signifie que chacun de vos processus enfants reçoivent leur propre copie de "k", et chaque copie de "k" ne incrémentée une fois.
Pour avoir tous les processus de communiquer avec le "même" k variable, vous devez effectuer une sorte de communications interprocessus.
Des exemples de bonnes de communication inter-processus:
Ont le parent processus de création d'un segment de mémoire partagée qui stocke la valeur de k. Demandez aux enfants de processus d'attente pour un arrachage de segment de mémoire partagée (par l'intermédiaire d'un processus parent créé mutex). Lorsque l'enfant a le le verrou exclusif, demandez à l'enfant de lire la valeur de k et de stocker la valeur de k + 1.
Créer une per-process entre le parent d'un processus enfants. Demander au parent de lire la pipe pour un message indiquant que le désir d'incrémenter k. Avoir le processus parent puis incrémenter k au nom de l'enfant.
Exemples de mauvaise communication inter-processus:
OriginalL'auteur Edwin Buck
Processus enfant ne peut pas par défaut changer quoi que ce soit dans le parent de l'espace d'adresse. Vous avez besoin de la mémoire partagée pour que, ainsi qu'un mécanisme de mutex pour éviter des conditions de course.
OriginalL'auteur Fred Foo
Processus, par définition, ne peut pas modifier les ressources des autres processus (comme les variables globales, etc) directement. Vous souhaitez utiliser des threads plutôt que les processus pour cela. Regarder dans pthread_create(3) ou clone(2)
OriginalL'auteur Chris Dodd
Un processus enfant obtient une copie de parents d'espace d'adressage. En d'autres termes, chaque enfant a sa propre copie des variables globales.
Vous avez besoin de mettre votre variable dans une mémoire partagée de la cartographie pour permettre à tous les processus enfants et le parent processus partagent la même variable.
OriginalL'auteur Maxim Egorushkin