Nach einen Printf warten bis auch wirklich auf der Konsole geschrieben worden ist?

... komplette Frage anzeigen

5 Antworten

Du musst die von dir programmierten parallel arbeitenden Prozesse synchronisieren, z.B. dadurch, dass du sie als Threads implemetierst und die Boost Funktionen verwendest.

Boost ist eine mit auch auf solche Probleme spezialisierte C++ Code Bibliothek: http://www.boost.org/doc/libs/1_36_0/doc/html/interprocess/synchronization_mechanisms.html .

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von klauszi
20.11.2015, 08:30

Ich wünschte, ich könnte Threads verwenden. Aber Nein ich muss Prozesse (mithilfe von MPI) verwenden und sie sollen miteinander kommunizieren :D.

1

Das ist gar nicht so einfach.

Printf übergibt die Daten zur Ausgabe an einen Puffer und beauftragt das Betriebssystem mit der Ausgabe im Terminal.
Ab diesen Augenblick hat das von dir geschriebene Programm gar keinen Einfluss mehr darauf, wie und wann das System die Ausgabe nun letztendlich auf das Ausgabegerät schreibt.

Ich hatte mal vor langer Zeit ein sehr ähnliches Problem und hab es gelöst, indem ich alle Ausgaben der einzelnen Prozesse nicht mit printf() direkt ans Terminal geschrieben habe sondern an einen eigenen extra gestarteten Prozess geschickt habe, der alle Ausgaben gesammelt, sortiert und dann selber und nur er alleine mit printf aufs terminal geschrieben hat.

Verstehst, was ich meine? So eine Art Eventhandler für die Ausgabe.

Antwort bewerten Vielen Dank für Deine Bewertung

Probiere mal:

fflush(stdout);
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von martin7812
20.11.2015, 12:55

Sorry, habe die Antwort von "NoHumanBeing" nicht gelesen.

Dein Problem ist ein völlig anderes:

Du musst nicht warten, bis "printf" fertig ist, sondern wahrscheinlich bis der Prozess, den du gestartet hast, fertig ist, bevor du ein erneutes printf machst.

Alternativ kannst du natürlich auch die Ausgabe eines Prozesses "abfangen" und am Ende ausgeben, also in etwa so:

...
process1 = StartProcess(...);
process2 = StartProcess(...);
...
WaitUntilProcessFinished(process1);
WaitUntilProcessFinished(process2);
printf("Ausgabe von process1:\n");
PrintOutputOfProcess(process1);
printf("Ausgabe von process2:\n");
PrintOutputOfProcess(process2);
...

Das Ganze ist aber nicht so trivial, wie ich es hier dargestellt habe.

Außerdem wird es in verschiedenen Betriebssystemen anders gemacht.

1

Erst wenn du dich entscheiden kannst ob du gerade C oder C++ benutzt

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von klauszi
20.11.2015, 06:32

C :), danke für den Hinweis

1

Mit "fflush" vielleicht?

http://www.cplusplus.com/reference/cstdio/fflush/

Das leert den Puffer des I/O-Geräts. Wenn es auf die Standardausgabe angewandt wird, würde ich erwarten, dass "erzwungen wird", dass die Shell die Zeichen tatsächlich darstellt.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von klauszi
20.11.2015, 07:20

Ich wünschte es wäre so :). Ich arbeite mit einen Prozess, welches zuerst einiges printet und weitere Prozesse aufruft, die ebenfalls printen. Die Prints sind leider ab und zu durcheinander. Da hilft leider auch kein fflush :(.

1

Was möchtest Du wissen?