Wie fork() n child-Prozesse richtig in C?
Dass ist mein code.
#include <stdio.h>
#include <stdlib.h>
int main ( int argc, char *argv[] )
{
int i, pid;
for(i = 0; i < atoi(argv[1]); i++) {
pid = fork();
if(pid < 0) {
printf("Error");
exit(1);
} else if (pid == 0) {
printf("Child (%d): %d\n", i + 1, getpid());
exit(0);
} else {
wait(NULL);
}
}
}
Die Ausgabe ist so.
Child (1): 5676
Child (2): 4624
Child (3): 4800
Child (4): 5596
Child (5): 5580
Aber das ist nicht das erwarten die Ausgabe in der meine Hausaufgaben.
Sollte es so sein. Was ist falsch mit dem code? Kann mir jemand helfen?
Child (2): 4625
Child (1): 4624
Child (3): 4626
Child (4): 4627
Child (5): 4628
Danke für Eure Hilfe. Jetzt werde ich es ausprobieren.
P. S. Sorry mein Englisch ist schlecht. Ich hoffe, Sie können verstehen, was ich sagte.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code funktioniert perfekt auf meinem computer. Es kann sein os abhängig.
jedoch sollten Sie überprüfen, ob argc ist nicht gleich 1 zu vermeiden, "segmentation fault" wenn keine Argumente gegeben werden, Ihr Programm.
Nimmt das system frei PIDs zuweisen Prozesse. Sie können die Gabel die Prozess-ID würde 4000 und ein Kind haben ID hatte 3900. Sie Hausaufgaben Papier sollte nicht selbst zahlen, weil die erste Prozess-ID ist nie der gleiche sowieso.
Mit, dass die erwartete Ausgabe, die meisten wahrscheinlich, Ihre Hausaufgaben machen sollte ersten Gabelung aus allen Prozessen und rufen Sie dann warten.
Überspringen Sie einfach die wait-Aufruf in der Schleife und nicht eine separate unten, sollte die Schleife bis
wait
zurück-1
underrno
eingestelltECHILD
. Beachten Sie, dass die Ausgabe-Reihenfolge der Kinder wird zufällig sein, oder zumindest nicht ganz in Ordnung, also nicht unbedingt 2 1 3 4 5.Dies ist nur eine Vermutung aber Sie sollte mehr Informationen, wenn Sie möchten, eine spezifische Antwort.
Der Grund, warum man eine unsortierte Ausgabe ist, dass Sie können nicht genau voraussagen, welche dem Kind wird aktiv, wenn. So kann es passieren, dass die Ausführung Ihres 1. Kindes ist verzögert, bis die 2. ist
fork()
ed und gestartet.Ihre Kinder in der Regel erhalten sequentielle PIDs, obwohl dies Betriebssystem abhängig.
Beide Fragen sollte nicht sein ein problem mit Ihrer geplanten Aufgabe - weder die absolute PIDs sind wirklich von Bedeutung ist (wie gesagt, jedes OS seine eigenen Sachen, Zuweisung von PIDs sequentiell oder zufällig), noch die Reihenfolge, in der die Kinder tun, Ihre Sachen: jeder Teil der Kinder kann mit unterschiedlichen Laufzeiten, was unsortierte Ausgabe. Dies gilt, solange die Daten korrekt übertragen werden - das ist der Fall, wenn der Elternteil generiert die Sequenz und dann Gabeln. In diesem Fall wird der Kind-Prozess das memory-layout ist das gleiche wie die Eltern zum Zeitpunkt der Gabel. So kann der Elternteil ändern Sie den "Daten-transfer array", ohne die schon Laufenden Kinder.
Zur Verringerung der Verwirrung, Sie könnten entfernen Sie die Ausgabe von PIDs in jeder Zeile. Vielleicht können Sie die Ausgabe auf den jeweiligen Beginn der Kind-Prozess, aber nach, dass, sollte es genug sein zu sagen, z.B.
Child 3: straight length 6 <S6,H5,C4,S3,H2,SA>
ohne Wiederholung der PID.