Prozess mit mehreren untergeordneten Elementen

Lesezeit: 3 Minuten

Benutzer-Avatar
Israkir

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

zum Beispiel ein externer Sortieralgorithmus, der mit untergeordneten Prozessen angewendet wird; Jeder untergeordnete Prozess sortiert einen Teil der Daten und schließlich führt der übergeordnete Prozess sie zusammen.

BEARBEITEN: Vielleicht sollte ich das Verzweigen mehrerer untergeordneter Prozesse mit Schleife erwähnen.

  • wärst du nicht besser dran mit Threads?

    – AviD

    18. Mai 2009 um 7:41 Uhr

  • Nun, das mag stimmen … aber ich muss das Multiple Forking () üben, was mehrere untergeordnete Prozesse bedeutet.

    – Israkir

    18. Mai 2009 um 7:46 Uhr

So teilen Sie 10 Kinder und warten, 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.
}

  • Ich habe den zweiten Teil nicht wirklich verstanden (warten, bis die Kinder beendet sind). Was bedeutet Status? ist das eine untergeordnete Prozesseigenschaft?

    – Israkir

    18. Mai 2009 um 15:03 Uhr

  • Status ist der Exit-Status des untergeordneten Prozesses. Es hängt vom Wert von exit(…) ab, oder wenn der Prozess durch ein Signal beendet wird, hängt es von der Signalnummer ab. Sehen Sie dies für mehr: linux.die.net/man/2/wait

    – Pkt

    20. Mai 2009 um 0:12 Uhr

  • Eine Frage: Verzweigen Sie von demselben Root-Elternteil oder von jedem Kind?

    – Oh Chin Boon

    22. Mai 2011 um 9:38 Uhr

  • hallo pts! Ich habe mich gefragt, warum die untergeordneten Prozesse sich nicht in neue Prozesse spalten. Ich habe gerade den Aufruf von exit(0) bemerkt. Ich möchte Sie fragen: Wenn dieser Aufruf dort nicht vorhanden wäre, hätten die untergeordneten Elemente fork() sowie den übergeordneten Prozess aufgerufen, nicht wahr? Ich meine, der erste untergeordnete Prozess hätte i = 0 und würde 10 Gabeln aufrufen … Ich meine, die untergeordneten Prozesse würden in die for-Schleife eintreten, oder??

    – Flyer88

    22. Juni 2011 um 3:33 Uhr


  • @flyer88: Ja, würden sie.

    – Pkt

    21. Dezember 2013 um 1:01 Uhr

Ich denke, es wäre erwähnenswert, warum Threads hier besser geeignet sind:

Da Sie versuchen, einen “Teil” der Arbeit 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 ursprünglichen Informationen nach fork(). Jede Änderung in einem Prozess ist dem anderen nicht bekannt, und Sie müssten die Informationen als Nachricht weiterleiten (z. B. durch eine Pipe, siehe “Man Pipe”). Threads in einem Prozess teilen sich denselben Adressraum und sind daher in der Lage, Daten zu manipulieren und sie “sofort” füreinander sichtbar zu machen. Ich füge auch die Vorteile hinzu, leichter zu sein, und würde mich für pthreads() entscheiden.

Immerhin: Sie werden alles über fork() lernen, wenn Sie sowieso pthreads verwenden.

  • Andererseits, wenn Sie Arbeit vom Benutzer bereitgestellt wird, möchten Sie dies in einem neuen Verfahren für den Aufprallschutz tun.

    – Alex Chamberlain

    9. Januar 2013 um 19:41 Uhr

Wenn Sie mehrere Forks starten möchten, sollten Sie dies rekursiv tun. Dies liegt daran, dass Sie fork vom übergeordneten Prozess aufrufen müssen. Wenn Sie andernfalls einen zweiten Fork starten, werden Sie sowohl den übergeordneten als auch den ersten untergeordneten Prozess duplizieren. 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);
        }
    }
}

Benutzer-Avatar
Matthäus Flaschen

Sie können dies mit tun Gabel. Ein bestimmter Elternteil kann beliebig oft forken. Allerdings stimme ich AviD zu pthreads 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
}

1288600cookie-checkProzess mit mehreren untergeordneten Elementen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy