C - benutze fork () und exec () zweimal

8

Ich habe den folgenden Code:

%Vor%

Der Name dieses Programms lautet myProgram . Das Argument, das ich in der Shell zur Verfügung stelle, ist:

%Vor%

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.

    
gambit20088 17.01.2017, 19:14
quelle

3 Antworten

5

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.

    
Rob K 17.01.2017 20:04
quelle
2

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.

    
Tony Tannous 17.01.2017 21:31
quelle
0

Also, ohne es zu merken, hat mein Programm die richtige Ausgabe geliefert. Mein Programm heißt myProgram und es wird wie folgt gestartet:

%Vor%

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:

%Vor%

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!

    
gambit20088 18.01.2017 00:25
quelle

Tags und Links