Comment utiliser clone() pour effectuer des processus parent et de l'enfant processus de s'exécuter en même temps?
Je suis nouveau sur linux. Je veux faire un processus enfant et parent processus en même temps. Mais je n'ai pas réussi. Voici mon code. Quelqu'un peut-il m'aider?
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sched.h>
#include <signal.h>
#define FIBER_STACK 8192
void * stack;
int do_something(){
int a = 0;
while (a<10){
printf("pid : %d, a = %d\n", getpid(), a++);
}
exit(1);
}
int main() {
void * stack;
stack = malloc(FIBER_STACK);
if(!stack) {
printf("The stack failed\n");
exit(0);
}
int a = 0;
if (c == 0)
clone(&do_something, (char *)stack + FIBER_STACK, CLONE_VM|CLONE_VFORK, 0);
while (a<10){
printf("pid : %d, a = %d\n", getpid(), a++);
}
free(stack);
exit(1);
}
Je veux qu'ils s'exécutent dans le même temps, mais le processus parent attendre jusqu'à ce que l'enfant est terminé.
- Veuillez lire la page de man pour
clone
, en particulier la partie surCLONE_VFORK
. - Je sais. J'ai essayer d'utiliser execve pour rendre le processus parent continuer à fonctionner. Mais il redémarrer mon principal et provoquer une boucle infinie.
- Voici une astuce: restez à l'écart de
vfork
etCLONE_VFORK
, ils sont bizarres. L'utilisation de la plainefork
plutôt queclone
. Et ne jetez jamais le code de retour de fork (ou clone, ou d'autres appels système), vous avez absolument besoin de les vérifier. Également ajouter une certaine forme de veille/attente dans votre boucle, sinon il va courir trop vite, la plupart du temps pour vous, pour voir si elle fonctionne ou pas. - En fait, pour savoir comment utiliser le clone mes devoirs. Je vais essayer d'apprendre fourche trop, mais j'ai aussi apprendre à utiliser un clone. Pouvez-vous m'apprendre?
Vous devez vous connecter pour publier un commentaire.
De
clone
Cela signifie avec
CLONE_VFORK
, il est censé attendre jusqu'à ce que l'enfant a terminé, ou unexec
.Puisque vous exécutez une fonction dans l'enfant, vous n'avez pas besoin
exec
. Il suffit de laisser leCLONE_VFORK
et à la fois le parent et l'enfant s'exécuter simultanément.