Hier ist, wie mein Programm artikuliert: Es gibt einen Elternteil, der ein Kind gabelt und dieses Kind gibt sich ein anderes Kind. Also gibt es ein Elternteil, ein Kind und ein Unterkind (d. H. Das Elternteil dieses Unterkindes ist das Kind).Wie warten Sie ein Subchild und ein Elternteil vor dem Ausführen des Prozesses?
Das Kind ausführen einen Befehl mit execlp(), sagen wir Datum, um es einfach zu machen. Das Unterkind macht das gleiche.
Natürlich gibt das Kind das Subchild ab, bevor es den Befehl ausführt.
Ich bin auf der Suche nach dem Sub-Kind, um den Befehl auszuführen, nachdem das Kind seinen eigenen Befehl ausgeführt hat. Außerdem möchte ich, nachdem das Kind und das Unterkind ihren Befehl ausgeführt haben, dass der Elternteil seinen eigenen Prozess fortsetzt.
Ich habe 2 Probleme:
- Ich weiß nicht, wie die Eltern zu machen für die subchild Ausführung warten
- ich nicht die subchild Warten auf das Kind Ausführung machen kann (tut das Kind seine pid verlieren, wenn execlp mit)
Hier ist meine aktuelle Implementierung:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char **argv){
pid_t pid1, pid2;
pid1 = fork();
if (pid1 > 0)
{
int status;
// Wait child
printf("Parent waiting for child\n");
waitpid(pid1, &status, 0);
printf("Parent has waited child\n");
// Wait subchild
printf("Parent waiting for subchild\n");
// Wait sub-child here?
printf("Parent has waited subchild\n");
// End
printf("parent end\n");
}
else
{
pid2 = fork();
// Subchild
if (pid2 == 0) {
waitpid(getppid(), NULL, 0); // wait child? it doesn't work
execlp("/bin/date", "date", "+Subchild:\"%d-%m-%y\"", (char *) 0);
_exit(EXIT_FAILURE);
}
// Child
else {
execlp("/bin/date", "date", "+Child:\"%d-%m-%y\"", (char *) 0);
_exit(EXIT_FAILURE);
}
}
return 0;
}
Meine zwei „Probleme“ sind 21 und 33.
Der Ausgang ist die folgende:
Parent waiting for child
Subchild:"03-10-17"
Child:"03-10-17"
Parent has waited child
Parent waiting for subchild
Parent has waited subchild
parent end
Die subchild sich so schnell ausgeführt wird, wie es kann ... ich beschlossen dies durch gemeinsame Variable, aber es fühlte sich wie ein Workaround und ich hatte immer noch Probleme mit dem Elternteil auf das Unterkind warten.
Es ist ein bisschen schwer, Rat zu geben, trotz der Klarheit Ihrer Frage. Wenn Sie möchten, dass Dinge sequenziell ausgeführt werden, scheint das Verzweigen von Unterprozessen der falsche Weg zu sein. Warum Gabel? Was versuchst du zu tun, dass du separate Prozesse, sondern sequenzielle Ausführung schaffst? Wenn Sie keine Programme ausführen, können Sie Signale verwenden, um zwischen Eltern und Prozessgruppe hin und her zu signalisieren, aber wenn Sie exec ausführen, verlieren Sie diese Option. – Leonard
Eine andere gute Lektüre zum Thema (mit Beispiel) ist [** Mann 2 warten **] (https://linux.die.net/man/2/wait) –
Vielen Dank für Ihren Kommentar. Das ist mehr wie ein Bildungsprogramm, bei dem die Schwierigkeit diese Architektur ist, mit der ich eine Möglichkeit finden muss, eine sequenzielle Ausführung zu erstellen. Ich habe mehrere Lösungen ausprobiert, aber wie Sie gesagt haben, macht es die exec() ziemlich schwierig (shared variable/semaphore/...). – SugarMouse