Wie Gabel mehrere Prozesse von einem gleichen Elternteil?
Ich versuche zu erstellen, die mehrere Prozesse aus einer gleichen Eltern, aber es endete immer damit, mehr Prozesse ab, als erwartet. Ich konnte nicht herausfinden, wie es zu tun und benötigen hier etwas Hilfe.
Fand ich ein Stück code online und versucht es,
int main ()
{
pid_t pid=0;
int i=0;
for (i=0; i<3; i++)
{
pid=fork();
switch(pid)
{
case 0:
{
cout<<"\nI am a child and my pid is:"<<getpid();
cout<<endl;
exit(0);
break;
}
default:
{
cout<<"\nI am a parent and my pid is: "<<getpid();
cout<<"\nMy child pid is: "<<pid;
cout<<endl;
wait(NULL);
break;
}
}
}
return 0;
}
Dieser code funktioniert und schafft 3 Kinder von gleichen Eltern. Jedoch, wie es scheint, das ist, weil nach jedem child-Prozess erstellt wurde, war es sofort beendet. Also wird es keine Gabel mehr Enkel-Prozess in die nächste Runde der for-Schleife. Aber ich brauche, um diese Kind-Prozesse laufen für einige Zeit und Sie brauchen, um mit den Eltern zu kommunizieren.
Ist es produziert die Ausgabe "ich bin ein Kind ... "? Sobald Sie den Anruf beenden Sie den Prozess endet. Der Grund, warum Sie das Ende so schnell ist, dass Sie nicht etwas zu tun in den Prozess. Sollten Sie rufen einige CPU-intensive Funktion, anstelle von drucken und sofort beenden.
Dies ist nicht ein problem mit der Gabel, aber eine einfache Logik problem.
Danke Euch beiden für die Beantwortung meiner Frage. Ich meine modifizierten code mit if..else-Anweisung anstelle der Fall..wechseln und das hinzufügen einer Pause am Ende der Gabel-Kind-Prozess, um aus der Schleife, und es funktioniert!!!!! Ich habe genau das, was ich will!!!
Rufen Sie nicht
Ich kann nicht herausfinden, was Sie tatsächlich gefragt. Ihr code erreicht das Ziel in Ihrem Titel. Am Ende des Körpers, geben Sie an, was Sie wirklich wollen, zu tun. Aber Sie Fragen nicht, keine Frage, wie es zu tun. So erhalten Sie dumme Antwort wie "code, was Sie brauchen, und wenn Sie in Schwierigkeiten geraten, um Hilfe zu bitten".
Dies ist nicht ein problem mit der Gabel, aber eine einfache Logik problem.
fork()
0 zurück in das Kind. Spur auf dem Papier, was hier geschieht, ohne die exit
für das Kind, wird die Schleife erneut ausgeführt, und fork
erneut ausgeführt wird. Was Sie tun möchten, ist falls der Prozess ist das Kind, gehen Sie aus der Schleife, die andere, die Sie weiter Schleife und Verzweigung ...Danke Euch beiden für die Beantwortung meiner Frage. Ich meine modifizierten code mit if..else-Anweisung anstelle der Fall..wechseln und das hinzufügen einer Pause am Ende der Gabel-Kind-Prozess, um aus der Schleife, und es funktioniert!!!!! Ich habe genau das, was ich will!!!
Rufen Sie nicht
exit
bei den Kindern. Dies bewirkt, dass atexit
Aufgaben (wie Spül-Puffer) , die mehr als einmal vorkommen. Verwenden _exit
.Ich kann nicht herausfinden, was Sie tatsächlich gefragt. Ihr code erreicht das Ziel in Ihrem Titel. Am Ende des Körpers, geben Sie an, was Sie wirklich wollen, zu tun. Aber Sie Fragen nicht, keine Frage, wie es zu tun. So erhalten Sie dumme Antwort wie "code, was Sie brauchen, und wenn Sie in Schwierigkeiten geraten, um Hilfe zu bitten".
InformationsquelleAutor Karen | 2014-10-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kind-Prozess kann sofort brechen Sie die Schleife, um Ihre Arbeit fortsetzen außerhalb
BEARBEITEN
Die
wait(NULL)
Linien sind falsch. Wenn der Prozess hat keine Kinder, aktiv,wait()
keine Wirkung hat, so ist es nutzlos, Kinder hier. OTOH in der parent-Prozesswait()
unterbricht die Ausführung bis alle der Kinder beendet. Wir haben drei Kinder hier, so müsstewait()
drei mal. Zudem kann man nicht im Voraus wissen, die Reihenfolge der Kinder, die Fertigstellung, so dass wir Sie brauchen würden, viel ausgereifter code. So etwas wie dieses:Jedes Kind proces erbt eine Kopie des übergeordneten Daten enthalten und die
i
variable zwischen Ihnen (das ist, warum ich es ausdrucken hier). So können Sie eineswitch(i){...}
für die Auswahl geeigneter arbeiten für jedes Kind. Achtung: es gibt keine 'zurück zu den Eltern", ich meine das Kind proces keine 'return'. Dafork()
dem Elternteil und dem Kind führen simulaneously. Sie müssenwait()
im übergeordneten Prozess, wenn Sie wollen, synchronisieren Sie es mit Kindern (z.B. Verwendung Ihrer Ergebnisse).Bearbeitet meine Antwort.
Die Art und Weise wie ich Sie in en zu Bearbeiten, die Sie verwenden Ergebnisse des Kinder-Prozessen Arsch, sobald Sie verfügbar sind. Sie können auch machen es einfacher, mit 3-parameter
wait()
, die nur darauf warten für die Kinder in der Reihenfolge wie Sie gestartet wurden, statt zu fangen, da Sie komplett:for(i=0;i<3;i++) {wait(work[i].childpid, ..., ...); ...}
(oder vielleicht gibt es einen entsprechenden parameter-1 -waitpid()
Funktion - siehe die man-Seiten).InformationsquelleAutor CiaPan