Comment passer des arguments à des processus créé par fork()
Je veux créer des copies d'un processus à l'aide de fork() en C.
Je ne peux pas comprendre comment passer des arguments à la copie de mon processus.
Par exemple,je veux passer un entier pour le processus de copie.
Ou j'ai de quoi faire, si j'ai une boucle dans laquelle je l'appel fork() et que vous souhaitez transmettre une valeur unique à des processus (par exemple, 0...N)
for (int i = 0; i < 4; ++i) {
fork();
//pass a unique value to new processes.
}
fork
crée une copie d'un processus continu, il n'est pas lancer un processus.Lire advancedlinuxprogramming.com
OriginalL'auteur Basti | 2012-11-19
Vous devez vous connecter pour publier un commentaire.
La belle partie de
fork()
est que chaque processus que vous frayer obtient automatiquement une copie de tout ce que la mère a, ainsi, par exemple, disons que nous voulons faire passer un intmyvar
à chacun des deux processus enfants, mais je veux que chacun d'avoir une valeur différente du processus parent:Ce faisant, cela permet à chaque processus pour avoir une "copie" de
myvar
avec sa propre valeur.Si vous n'avez pas modifier la valeur, puis chaque fourche avais processus aurait la même valeur.
OriginalL'auteur Mike
Des variables locales et globales sont par nature préservée à travers un
fork()
, donc il n'y a pas besoin de "passer des arguments". Si vous êtes à l'appel d'une fonction dans la fourche processus, vous pouvez faire quelque chose comme:OriginalL'auteur duskwuff
Je suis en retard pour répondre, mais voici comment je le fais:
Tout d'abord, vous fork (), le processus pour créer un nouveau processus. Il a toujours le même espace mémoire que l'ancien. fork() renvoie pour les deux processus parents et enfants. Si la fourche() renvoie zéro, vous êtes le processus de l'enfant. L'enfant utilise ensuite execl() pour remplacer le processus de la mémoire avec un à partir d'un nouveau fichier.
Avis que nom_du_programme est donné deux fois à execl(). Le premier est ce que execl() va tenter de s'exécuter, le deuxième est argv[0]. Vous devez fournir à la fois ou que l'argument de comptage sera désactivé par un. Nom_du_programme doit contenir toutes les informations de chemin d'accès pour trouver le désiré image exécutable.
Je donne deux arguments dans cet exemple, mais vous pouvez passer autant que vous le souhaitez. il doit être terminé par NULL, et je pense que vous devez le jeter comme (char *) comme je l'ai montrer.
Cette approche vous donne une entière indépendance du processus avec des arguments et un unique pid. Il peut continuer à fonctionner longtemps après que le processus père se termine, ou il peut mettre fin avant que le parent.
OriginalL'auteur user2246302
Vous pouvez utiliser clone() (qui est en fait utilisé par fork ()). Il vous permet de passer un arg à votre entrée en fonction.
http://linux.die.net/man/2/clone
clone
est complexe, spécifique à Linux, syscall qui nécessite une très bonne connaissance de Linux, et est principalement réservée à quelques-uns des gourous application bibliothèques de thread (à la pthread). Voir aussifutex(7)
page de man.Exactement. Utilisez uniquement clone si vous faites un peu de réel faible niveau de piratage -- le seul point de clone est de vous permettre de faire certaines choses dans l'espace utilisateur qui avant ne pouvait se faire dans l'espace noyau, tels que le fil de mise en œuvre. Il n'est pas d'un usage général syscall.
OriginalL'auteur imreal
Voir le
exec()
de la famille de fonctions.EDIT: Si vous essayez d'initialiser les copies du même programme que le processus de base, continuez simplement à l'aide de variables comme l'a suggéré duskwuff.
OriginalL'auteur ezod