22 Stimmen

Mehrere untergeordnete Prozesse

Kann mir jemand helfen, wie ich mehrere untergeordnete Prozesse erstellen kann, die denselben Elternteil haben, um "einen" Teil einer bestimmten Aufgabe zu erledigen?

z.B. ein externer Sortieralgorithmus, der mit untergeordneten Prozessen angewandt wird; jeder untergeordnete Prozess sortiert einen Teil der Daten und schließlich führt der übergeordnete Prozess sie zusammen.

EDIT: Vielleicht sollte ich das Forking mehrerer Kindprozesse mit Schleife erwähnen.

0 Stimmen

Wäre es nicht besser, wenn Sie Gewinde verwenden würden?

0 Stimmen

Nun, das mag richtig sein.. aber ich muss das mehrfache forking() üben, was mehrere Kindprozesse bedeutet.

68voto

pts Punkte 70857

Hier wird beschrieben, wie man 10 Kinder aufgabelt und wartet, bis sie fertig sind:

pid_t pids[10];
int i;
int n = 10;

/* Start children. */
for (i = 0; i < n; ++i) {
  if ((pids[i] = fork()) < 0) {
    perror("fork");
    abort();
  } else if (pids[i] == 0) {
    DoWorkInChild();
    exit(0);
  }
}

/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
  --n;  // TODO(pts): Remove pid from the pids array.
}

2 Stimmen

Ich habe den zweiten Teil nicht wirklich verstanden (warten, bis die Kindprozesse beendet sind). was bedeutet Status? ist das eine Eigenschaft der Kindprozesse?

0 Stimmen

Status ist der Beendigungsstatus des Kindprozesses. Er hängt vom exit(...)-Wert ab, oder wenn der Prozess durch ein Signal beendet wird, dann von der Signalnummer. Siehe dies für mehr: linux.die.net/man/2/wait

0 Stimmen

Eine Frage, sind Sie forking von der gleichen Root-Eltern oder von jedem Kind?

7voto

mjdev Punkte 121

Wenn Sie mehrere Forks starten wollen, sollten Sie dies rekursiv tun. Der Grund dafür ist, dass Sie fork vom Elternprozess aus aufrufen müssen. Wenn Sie sonst einen zweiten Fork starten, duplizieren Sie sowohl den Elternprozess als auch den ersten Kindprozess. Hier ist ein Beispiel:

void forker(int nprocesses)
{
    pid_t pid;

    if(nprocesses > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork");
        }
        else if (pid == 0)
        {
            //Child stuff here
            printf("Child %d end\n", nprocesses);
        }
        else if(pid > 0)
        {
            //parent
            forker(nprocesses - 1);
        }
    }
}

5voto

pmr Punkte 56454

Ich denke, es lohnt sich, darauf hinzuweisen, warum Threads hier besser geeignet sind:

Da Sie versuchen, einen "Teil" der Aufgabe parallel zu erledigen, gehe ich davon aus, dass Ihr Programm das Ergebnis der Berechnung kennen muss. fork()s eines Prozesses teilen nicht mehr als die anfänglichen Informationen nach fork(). Jede Änderung in einem Prozess ist dem anderen Prozess unbekannt und Sie müssten die Informationen als Nachricht weitergeben (z.B. durch eine Pipe, siehe "man pipe"). Threads in einem Prozess teilen sich denselben Adressraum und können daher Daten manipulieren und sie für den anderen "sofort" sichtbar machen. Wenn man noch die Vorteile der Leichtgewichtigkeit hinzufügt, würde ich pthreads() wählen.

Schließlich lernen Sie alles, was Sie über fork() wissen müssen, wenn Sie ohnehin pthreads verwenden.

1 Stimmen

Andererseits, wenn Sie Arbeit vom Benutzer bereitgestellt wird, sollten Sie dies in einem neuen Prozess tun, um Abstürze zu vermeiden.

4voto

Matthew Flaschen Punkte 266507

Sie können dies tun mit Gabel . Ein bestimmtes Elternteil kann sich so oft gabeln, wie es will. Ich stimme jedoch mit AviD überein pthreads ist vielleicht besser geeignet.

pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild > 0)
{
  // In parent
  secondChild = fork();
  if(secondChild > 0)
  {
    // In parent
  }
  else if(secondChild < 0)
  {
    // Error
  }
  else
  {
    // In secondChild
  }
}
else if(firstChild < 0 )
{
  // Error
} 
else
{
  // In firstChild
}

0 Stimmen

Sollten wir nicht auch den Fall berücksichtigen, dass xxxChild < 0 einen Fehler auslöst? Ich denke, dass (xxxChild > 0) der geeignetere Fall ist...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X