Ich habe den folgenden Code:
%Vor% Der Name dieses Programms lautet myProgram
. Das Argument, das ich in der Shell zur Verfügung stelle, ist:
calc
ist ein anderes Programm, das ich mit myProgram
starten möchte.
myProgram
führt dann calc
aus, nimmt seine PID
und übergibt diese PID
an ein anderes Programm namens procmon
, das etwas damit macht; deshalb muss ich zweimal abzweigen.
Wenn ich jedoch den obigen Code ausführe, bekomme ich:
procmon: cannot open /proc/6225/stat, the monitored process is not running anymore
.
Wie kann ich das beheben?
Was macht calc
?
Es geht in eine for
-Schleife, inkrementiert eine int
Variable und geht für 3 Sekunden in den Ruhezustand und wiederholt das 10-mal. So sollte es für ungefähr 30 Sekunden laufen.
Was macht procmon
?
procmon
erhält einfach einen PID
eines Prozesses als Argument und zeigt die entsprechende /proc/PID/stat
-Datei an. Es funktioniert perfekt, wenn Sie es selbst ausführen.
Sie haben eine Wettlaufbedingung. Sie haben keine Garantie, dass das erste fork()
sogar tatsächlich zu Ihrem übergeordneten Prozess zurückkehrt, bevor der untergeordnete cal-Prozess die Ausführung beendet und beendet. Sie müssen die Ausführung Ihrer Prozesse synchronisieren.
ETA-Vorschläge zum Blockieren und Signalisieren
%Vor%Das Blockieren und Signalisieren über Interprozesskommunikation wird dem Übenden als Übung überlassen.
Habe ich zuerst nicht bemerkt ...
Ihr Hauptprozess erstellt zwei untergeordnete Prozesse, proc und prcmon. Ihr Problem ist, dass aufgrund von Race Conditions und Scheduling - calc zuerst beendet wird, was Sie also tun möchten, um calc zu zwingen, auf seinen Geschwisterprozess zu warten. Sie können nur warten () auf einen Prozess, den Sie erstellt haben ... Auf diese Weise können Sie nicht calc auf den Abschluss von prcmon warten.
ABER
Sie können einen Mechanismus implementieren, um den Parent-Prozess auf seine untergeordneten Elemente warten zu lassen, und die zurückgegebenen Daten dann per Pipe an andere untergeordnete Prozesse weiterzuleiten. In deinem Fall bin ich mir nicht sicher. Sie wollen in Prcmon die PID von calc bekommen und anzeigen? Ich weiß nicht, ob das möglich ist, denn sobald die Berechnung abgeschlossen ist, ist ihr Deskriptor gelöscht und existiert nicht mehr.
Eine Lösung für Ihr Problem besteht darin, calc schwere Berechnungen durchzuführen, da Sie es nur am Leben brauchen und nicht seinen Rückgabewert.
Also, ohne es zu merken, hat mein Programm die richtige Ausgabe geliefert.
Mein Programm heißt myProgram
und es wird wie folgt gestartet:
Wo calc
ein Programm ist, das 30 Sekunden lang einige grundlegende mathematische Operationen ausführt, nichts zu verrückt.
Dann wird ein anderer Prozess, procmon
, gestartet. procmon
übernimmt die PID
von calc
und gibt die Datei aus:
Was genau passiert ist. Ich habe diese Datei an meine Shell gesendet, was bedeutet, dass sowohl calc
als auch procmon
erfolgreich ausgeführt wurden.
Aus irgendeinem Grund dachte ich, dass ich eine neue Datei im System bekommen sollte, nachdem ich dieses Programm ausgeführt hatte, also habe ich nicht einmal viel Aufmerksamkeit darauf geschenkt, was in der Shell geschah.
Ich bedauere wirklich die Verwirrung, die es manchen Leuten zugefügt haben könnte, ich werde mir definitiv vor Augen halten, mein Problem noch einmal 1000 mal zu überprüfen, bevor ich frage.
Ich bin auch sehr dankbar für die Hilfe und Unterstützung aller, es ist großartig, ein Teil dieser Gemeinschaft zu sein!