sequentieller Programmablauf vs. Systemaufruf
-
Hi zusammen,
ich habe ein Programm implementiert, dass per Systemaufruf (anders geht es leider nicht) Dokumente holt und diese dann analysiert. Merkwürdigerweise bekomme ich bei jeder Ausführung verschiedene Ergebnisse.
Meine Vermutung ist jetzt, dass beim Systemaufruf nicht gewartet wird bis dieser abgeschlossen wird sondern, direkt sequentiell im Programmcode fortgefahren wird.
Daher meine Frage: Wird der Programmcode sequentiell ausgeführt und wartet dieser bei Systemaufruf darauf, dass diese abgeschlossen sind oder wird nur ein Systemaufruf durchgeführt und unabhängig, ob dieser beendet wurde der Programmcode fortgeführt.
Was kann ich in diesem Fall tun?
-
Was meinst du mit "Systemaufruf"? Die Funktion system() wartet afaik, bis das aufgerufenene Programm beendet ist (aber die kann keine Daten ans Programm zurückliefern), popen() kehrt sofort zurück und stellt einen Kanal zur Verfügung, über den du dann die Ausgaben des Befehls abholen kannst.
(und ohne zu wissen, womit du arbeitest, wird es schwierig zu helfen)
-
Ich arbeite mit system().
Der Code sieht in etwa so aus:
... C++-Methode1 C++-Methode2 system(externes Programm) C++-Methode3 C++-Methode4 ...Wird die C++-Methode3 erst aufgerufen, wenn system(externes Programm) beendet ist?
-
HariboLight schrieb:
Wird die C++-Methode3 erst aufgerufen, wenn system(externes Programm) beendet ist?
Ja.
-
Bashar schrieb:
HariboLight schrieb:
Wird die C++-Methode3 erst aufgerufen, wenn system(externes Programm) beendet ist?
Ja.
Naja, system macht intern idR eine Shell auf und dann wird auch gewartet, bis die Shell zurückkehrt (der Rückgabewert wird schließlich benötigt).
Man könnte aber (in Unix mit nohup oä) das Programm von der Shell abkoppeln, so daß die Daten dann nach der Rückkehr von system trotzdem nicht vollständig geschrieben sind. Also hat man bei Programmen dieser Bauart potentielle race conditions erzeugt. Das wird normalerweise dann zum Problem, wenn der User den system-Argumenten-String wenigstens teilweise selbst festlegen kann.
-
Naja, system macht intern idR eine Shell auf und dann wird auch gewartet, bis die Shell zurückkehrt (der Rückgabewert wird schließlich benötigt).
Man könnte aber (in Unix mit nohup oä) das Programm von der Shell abkoppeln, so daß die Daten dann nach der Rückkehr von system trotzdem nicht vollständig geschrieben sind. Also hat man bei Programmen dieser Bauart potentielle race conditions erzeugt. Das wird normalerweise dann zum Problem, wenn der User den system-Argumenten-String wenigstens teilweise selbst festlegen kann.
Heißt das nun, dass das Programm standardmäßig weiterläuft bevor die Shell beendet ist oder nicht? Ich benutze screen, hat dies Einfluß darauf?
-
Daniel E. schrieb:
Man könnte aber (in Unix mit nohup oä) das Programm von der Shell abkoppeln, so daß die Daten dann nach der Rückkehr von system trotzdem nicht vollständig geschrieben sind.
Richtig, aber dann wird eben gewartet, bis nohup beendet ist. Dass als Nebeneffekt ein Prozess im Hintergrund weiterläuft ist dann eben so, das sollte man dann schon wissen.
Man sollte sich klarmachen, dass system genauso funktioniert wie die Shell. Man könnte sich die Shell auch vereinfacht so vorstellen:
for (;;) { cout >> "$"; string kommando; getline(cin, kommando); system(kommando.c_str()); }