it-swarm.com.de

Wie verwende ich Fork (), um nur 2 untergeordnete Prozesse zu erstellen?

Ich lerne ein wenig C und während ich die Gabel und die Wartefunktionen studierte, kam ich zu einem unerwarteten Ausgang. Zumindest für mich. 

Gibt es eine Möglichkeit, nur zwei untergeordnete Prozesse vom übergeordneten Element zu erstellen? 

Hier mein 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;
}

Und hier ist meine Ausgabe:

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

Bitte ignorieren Sie den Pfeifenteil, ich bin noch nicht so weit gekommen. Ich versuche nur, 2 untergeordnete Prozesse zu erstellen, also erwarte ich 3 "I'm pid ..." -Ausgaben, nur 1 für das übergeordnete Element, das ich warten werde, und 2 untergeordnete Prozesse, die über eine Pipe kommunizieren.

Lassen Sie mich wissen, wenn Sie sehen, wo mein Fehler ist.

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

Nehmen wir an, die ID des übergeordneten Prozesses ist 100, die erste Verzweigung erstellt einen anderen Prozess 101. Jetzt setzen sowohl 100 als auch 101 die Ausführung nach # 1 fort, so dass sie die zweite Verzweigung ausführen. pid 100 erreicht # 2, wodurch ein weiterer Prozess 102 erstellt wird. Pid 101 erreicht # 2, wodurch ein weiterer Prozess 103 erstellt wird. Somit enden wir mit 4 Prozessen.

Was Sie tun sollten, ist so etwas.

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

Nachdem Sie den Prozess erstellt haben, sollten Sie den Rückgabewert überprüfen. Wenn Sie dies nicht tun, wird die seconde fork() sowohl vom übergeordneten als auch vom untergeordneten Prozess ausgeführt. Sie haben also vier Prozesse. 

wenn Sie zwei untergeordnete Prozesse erstellen möchten, brauchen Sie nur:

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

Sie können n untergeordnete Prozesse wie folgt erstellen:

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

Wenn eine Fork-Anweisung vom übergeordneten Element ausgeführt wird, wird wie erwartet ein untergeordneter Prozess erstellt. Man könnte sagen, dass der Kindprozess auch die Fork-Anweisung ausführt, aber eine 0 zurückgibt, das übergeordnete Element jedoch die pid . Der gesamte Code nach der Fork-Anweisung wird sowohl vom übergeordneten als auch vom untergeordneten ausgeführt.

In Ihrem Fall passierte die erste Fork-Anweisung einen untergeordneten Prozess. Derzeit gibt es ein Elternteil P1 und ein Kind C1.

Jetzt treffen sowohl P1 als auch C1 auf die zweite Fork-Anweisung. Das übergeordnete Element erstellt wie erwartet ein anderes untergeordnetes Element (c2), aber selbst das untergeordnete Element c1 erstellt einen untergeordneten Prozess (c3). In der Tat haben Sie also P1, C1, C2 und C3, weshalb Sie 4 Druckanweisungsausgaben erhalten. 

Eine gute Möglichkeit, darüber nachzudenken, ist die Verwendung von Bäumen, wobei jeder Knoten einen Prozess darstellt und der Stammknoten der oberste übergeordnete Knoten ist.

3
rounak

Sie können einen untergeordneten Prozess innerhalb eines untergeordneten Prozesses erstellen. Auf diese Weise können Sie zwei Kopien des ursprünglichen übergeordneten Prozesses erstellen.

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;
}

Dies druckt Folgendes:

Hello my friends!
0
Rui Gonçalves

sie können den Wert überprüfen als if (pid <0) Prozesserstellung fehlgeschlagen Dies gibt an, ob die Erstellung des untergeordneten Prozesses nicht erfolgreich war. . .ork gibt die Prozess-ID des untergeordneten Prozesses zurück. ) wird vom übergeordneten Prozess verwendet. 

0
nilesh