Redirection In/Output eines Konsolen Programms, aus beliebigem anderen Programm heraus
-
Hallo Forum,
habe hier schon die Suchfunktion zum obigen Thema benutzt und folgendes gefunden:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-237474.html
Unten im Thread weisst Jochen auf einen Code von Microsoft hin:
http://support.microsoft.com/kb/190351
Den Code für "Redirect.c" habe ich rauskopiert und zu einer Anwendung kompiliert, was einwandfrei funktioniert. Weiterhin habe ich ein Beispielprogramm geschrieben, das mit dem Hauptprogramm ferngesteuert werden soll, hier der Code:
int main(int argc, char *argv[]){ char input[1024]; printf("CHILD.EXE v1.0\n"); printf("==============\n\n"); printf("Testproramm zur Fernsteuerung von Konsolen Anwendungen aus einer anderen Anwendung heraus. "); printf("Das Programm gibt die Benutzereingaben solange in der Konsole aus, bis es sich durch Eingabe von \"exit\" automatisch selbst beendet\n\n"); printf("Warte auf Eingabe: "); ZeroMemory(input,sizeof(input)); while(TRUE){ gets(input); if (!_stricmp(input,"exit")){ break; } printf("Ihre Eingabe war: [%s]\n\n", input); printf("Warte auf Eingabe: "); ZeroMemory(input,sizeof(input)); } return 0; }Versuche ich nun mein Programm "CHILD.EXE" mit dem Code von "Redirect.c" zu starten wird das auch ausgeführt, jedoch erhalte ich keine Redirection des Outputs, bis ich "exit" eingeben, erst dann werden alle zuvor gemachten Eingaben auf einem Schlag in meinem Fernsteuerprogramm ausgegeben.
Mir ist schon aufgefallen, das Microsoft für sein "Child.exe" (letzter Abschnitt des Microsoft Quellcodes) immer wieder fflush(..) aufruft, und es wohl daher mit dem Microsoft Childprogramm funktioniert. Das ist aber keine befriedigende Lösung, da ich unabhängig zur Implementierung durch den Programmierer des Childprogramms eine augenblickliche Ausgabe erreiche möchte. Wie geht das nun?
-
Ich habe es zwar nicht ausprobiert aber Microsoft schreibt doch ausdrücklich
fflush(NULL); // Must flush output buffers or else redirection will be problematic.
-
Ja da gebe ich dir recht, ich habe auch die Sache zu printf gelesen. Aber wenn ich nun eine fertige Konsolenanwendung benutze habe ich ja keinen Einfluss darauf wie der Programmierer der anderen Applikation das intern vorgesehen hat, also frage ich ja nach einer Möglichkeit eine Ein-/Ausgabe zu erzwingen. Auch ein Hinweis, das dies auf keinen Fall möglich ist, wäre hilfreich, denn dann bräuchte ich nicht weiter zu suchen.
Somit wäre eine Redirektion nur sinnvoll, wenn das Programm keine Eingabe erwartet und sich sowieso irgendwie selbst beendet. Also würde man in solch einem Fall lediglich die Ausgabe und die Fehlerausgabe umleiten, auf die hat man dann aber erst nach der Beendigung des Programmes Zugriff. Zugriff zur Laufzeit erhielte man natürlich auch, wenn printf intern irgendwie soetwas wie einen fflush auslöst, weil der interne Buffer voll ist.
Also wer kennt sich aus und kann helfen?
-
Es gibt keine Mögölichkeit andere Programm zu zwingen Puffer, die sie selbst benutzen, zu leeren.
Jede Runtime hat Ihre eigenen Buffering-Mechanismen um die Ausgabe möglichst schnell zu gestalten. Für ein Programm, das die Ausgabe sehen will ist es egal wann diese kommt... Der Nutzer kann dies sowieso nicht entscheiden ob Zeichenweise oder KB-weise die Daten auf dem Bildschirm erscheinen. Sehr wohl sieht man es aber an der Geschwindigkeit, die ein Programm zur Ausgabe benötigt. Deshalb wird je gepuffert!
Du wirst mit dem leben müssen was die andere Software eben macht, denn Du kannst deren Zwischenpuffer-Technik nicht aushebeln, außer die Software erlaubt Dir das durch Argeumente auf der Befehlszeile oder anderes...
-
Danke für die Antwort. Jetzt brauch ich meine Zeit nicht mehr mit googlen verschwenden.