web-dev-qa-db-fra.com

Comment utiliser Fork () pour créer seulement 2 processus enfants?

Je commence à apprendre un peu de C et, tout en étudiant la fourche, attendez que les fonctions que j’ai obtenues soient inattendues. Au moins pour moi. 

Est-il possible de ne créer que 2 processus enfants à partir du parent? 

Voici mon code:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main ()
{
    /* Create the pipe */
    int fd [2];
    pipe(fd);

    pid_t pid;
    pid_t pidb;


    pid = fork ();
    pidb = fork ();

    if (pid < 0)
    {
        printf ("Fork Failed\n");
        return -1;
    }
    else if (pid == 0)
    {
        //printf("I'm the child\n");
    }
    else 
    {
        //printf("I'm the parent\n");
    }

    printf("I'm pid %d\n",getpid());

    return 0;
}

Et voici ma sortie:

I'm pid 6763
I'm pid 6765
I'm pid 6764
I'm pid 6766

S'il vous plaît, ignorez la partie pipe, je ne suis pas encore arrivé à ça. J'essaie simplement de créer seulement 2 processus enfants, alors je m'attends à ce que 3 "Je suis pid ..." n'en affiche qu'un pour le parent que je vais faire attendre et deux processus enfants qui communiqueront via un canal.

Faites-moi savoir si vous voyez où est mon erreur.

17
mimoralea
pid = fork (); #1
pidb = fork (); #2

Supposons que l'ID de processus parent soit 100, le premier fork crée un autre processus 101. Maintenant, les deux 100 et 101 continuent l'exécution après # 1, ils exécutent donc le second fork. pid 100 atteint le n ° 2 en créant un autre processus 102. Le pid 101 atteint le n ° 2 en créant un autre processus 103. Nous aboutissons donc à 4 processus.

Ce que vous devriez faire est quelque chose comme ça.

if(fork()) # parent
    if(fork()) #parent
    else # child2
else #child1
31
tuxuday

Après avoir créé le processus, vous devez vérifier la valeur de retour. Si vous ne le faites pas, la seconde fork() sera exécutée à la fois par le processus parent et par le processus enfant. Vous disposez donc de quatre processus. 

si vous voulez créer 2 processus enfants, il suffit de:

if (pid = fork()) {
    if (pid = fork()) {
        ;
    } 
} 

Vous pouvez créer n processus enfants comme ceci:

for (i = 0; i < n; ++i) {
    pid = fork();
    if (pid > 0) {   /* I am the parent, create more children */
        continue;
    } else if (pid == 0) { /* I am a child, get to work */
        break;
    } else {
        printf("fork error\n");
        exit(1);
    }
}
13
Fei Xue

Quand une instruction fork est exécutée par le parent, un processus enfant est créé comme prévu. Vous pourriez dire que le processus enfant exécute également l'instruction fork mais renvoie 0, le parent cependant renvoie le pid . Tout le code suivant l'exécution de l'instruction fork est exécuté par les deux, parent et enfant.

Dans votre cas, ce qui se passait, c’est que la première instruction fork a créé un processus enfant. Il y a donc actuellement un parent, P1, et un enfant, C1.

Maintenant, P1 et C1 rencontrent la deuxième instruction fork. Le parent crée un autre enfant (c2) comme prévu, mais même l'enfant, c1 crée un processus enfant (c3). Donc, en réalité, vous avez P1, C1, C2 et C3, raison pour laquelle vous avez 4 sorties d’instruction d’impression. 

Une bonne façon de penser à cela consiste à utiliser des arbres, chaque nœud représentant un processus et le nœud racine étant le parent le plus élevé.

3
rounak

Vous pouvez créer un processus enfant dans un processus enfant. De cette façon, vous pouvez avoir 2 copies du processus parent d'origine.

int main (void) {
    pid_t pid, pid2;
    int status;

    pid = fork();

    if (pid == 0) { //child process
        pid2 = fork();
        int status2;

        if (pid2 == 0) { //child of child process
            printf("friends!\n");
        }
        else {
            printf("my ");
            fflush(stdout);
            wait(&status2);
        }
    }
    else { //parent process
        printf("Hello ");
        fflush(stdout);
        wait(&status);
    }

    return 0;
}

Cela imprime ce qui suit:

Hello my friends!
0
Rui Gonçalves

vous pouvez vérifier que la valeur est if (pid <0) création du processus infructueuse cela indique si la création du processus enfant a échoué. fork renvoie l'identifiant du processus enfant si getpid ( ) est utilisé depuis le processus parent .. 

0
nilesh