2017-10-03 2 views
0

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.

+0

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

+0

Eine andere gute Lektüre zum Thema (mit Beispiel) ist [** Mann 2 warten **] (https://linux.die.net/man/2/wait) –

+0

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

Antwort

0

Dank @JonathanLeffler konnte ich das Problem lösen, indem ich Rohre herstellte. Es hat einige Zeit gedauert, bis ich nicht wusste, wie Pfeifen funktionieren, aber am Ende war es viel einfacher als ich dachte.

@ DavidC.Rankin Ich habe die Dokumentation über die Wartefunktion gelesen, aber es scheint in dieser Situation keine Hilfe zu sein.

Vielen Dank.

Verwandte Themen