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:
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