mueslirocker
Mitglied
Du hast bei deinem CreatePipe die Größe des Buffers vergessen. ![Stick out tongue :p :p](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f61b.png)
Hm, dann hab ich doch noch einiges nicht verstanden, schätze ich.
Warum muss die Pipe dubliziert werden?
Inzwischen habe ich ein bisschen rumgesucht.
Ich habe eine Funktion gefunden, die mir scheinbar stdin zu einer Pipe (Handle) konvertiert.
GetStdHandle(STD_INPUT_HANDLE)
Leider gibts da n Fehler.
"input in flex scanner failed"
Wenn ich das "CloseHandle" weglasse, kommt der Fehler nicht, aber der Input wird nicht geschlossen, weil kein EOF kommt.
Darüberhinaus, scheint die Pipe leer zu sein.
Ich habe fp mal mit GetStdHandle(STD_OUTPUT_HANDLE) belegt.
Die erwartete Ausgabe auf der Konsole kommt auch.
Wenn ich deinen Code nehme und darunter WriteFile benutze, komme ich zum gleichen Ergebnis, denke ich.
Lex wartet auf eine Eingabe.
/edit
Okay, ich glaub, ich habe jetzt verstanden, warum Lex abgeschmiert ist, wenn ich das Handle geschlossen habe.
Zu einer Pipe gehören 2 Handles. Das eine lauscht, das andere spricht... zumindest in meinem Beispiel.
Ich muss das lauschende mit stdin belegen und das sprechende schließen, um mein EOF zu bekommen.
Gut... aber das Hauptproblem, dass stdin nicht gefüllt wird, ist leider nicht gelöst.
/edit2
Ich verstehe es nicht.
Die Pipe selbst scheint gut zu funktionieren.
.. das klappt super.
Auch wenn ich nun versuche fp_r stdin zuzuweisen, kann ich die Pipe auf diese Weise noch auslesen.
Aber das ganze hat keinen Effekt auf stdin.
Wer kein (f)lex hat und dennoch an dem Thema interessiert ist, müsste auch einfach versuchen können, ob getchar() was ausspuckt oder auf eine Eingabe wartet (wenns , muss man nicht warten).
Ich hab inzwischen ein Beispiel gefunden, in dem es jemand geschaff hat, stdin was zu schicken.
Allerdings hat der n neuen Prozess aufgemacht und dessen stdin/out/err mit seinen Pipes belegt (mit nem struct namens STARTUPINFO glaub ich). Habs auch nicht geschafft, das umzubauen.
Hier ist der Link:
http://www.3rd-evolution.de/tkrammer/docs/apipes.html
![Stick out tongue :p :p](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f61b.png)
Hm, dann hab ich doch noch einiges nicht verstanden, schätze ich.
Warum muss die Pipe dubliziert werden?
Inzwischen habe ich ein bisschen rumgesucht.
Ich habe eine Funktion gefunden, die mir scheinbar stdin zu einer Pipe (Handle) konvertiert.
GetStdHandle(STD_INPUT_HANDLE)
Code:
DWORD ignore;
HANDLE fp;
fp = GetStdHandle(STD_INPUT_HANDLE);
WriteFile(fp,"abcdef\n",7,&ignore,NULL);
CloseHandle(fp);
yylex();
"input in flex scanner failed"
Wenn ich das "CloseHandle" weglasse, kommt der Fehler nicht, aber der Input wird nicht geschlossen, weil kein EOF kommt.
Darüberhinaus, scheint die Pipe leer zu sein.
![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)
Ich habe fp mal mit GetStdHandle(STD_OUTPUT_HANDLE) belegt.
Die erwartete Ausgabe auf der Konsole kommt auch.
Wenn ich deinen Code nehme und darunter WriteFile benutze, komme ich zum gleichen Ergebnis, denke ich.
Lex wartet auf eine Eingabe.
/edit
Okay, ich glaub, ich habe jetzt verstanden, warum Lex abgeschmiert ist, wenn ich das Handle geschlossen habe.
Zu einer Pipe gehören 2 Handles. Das eine lauscht, das andere spricht... zumindest in meinem Beispiel.
Ich muss das lauschende mit stdin belegen und das sprechende schließen, um mein EOF zu bekommen.
Gut... aber das Hauptproblem, dass stdin nicht gefüllt wird, ist leider nicht gelöst.
/edit2
Ich verstehe es nicht.
![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)
Die Pipe selbst scheint gut zu funktionieren.
Code:
int main ()
{
DWORD ignore;
HANDLE fp_r, fp_w;
CreatePipe(&fp_r, &fp_w, NULL, 1000);
WriteFile(fp_w,"abcdef\n",7,&ignore,NULL);
CloseHandle(fp_w);
char buffer[7];
ReadFile(fp_r,buffer,7,&ignore,NULL);
fwrite(buffer,ignore,1,stdout);
return 0;
}
Auch wenn ich nun versuche fp_r stdin zuzuweisen, kann ich die Pipe auf diese Weise noch auslesen.
Aber das ganze hat keinen Effekt auf stdin.
Wer kein (f)lex hat und dennoch an dem Thema interessiert ist, müsste auch einfach versuchen können, ob getchar() was ausspuckt oder auf eine Eingabe wartet (wenns , muss man nicht warten).
Ich hab inzwischen ein Beispiel gefunden, in dem es jemand geschaff hat, stdin was zu schicken.
Allerdings hat der n neuen Prozess aufgemacht und dessen stdin/out/err mit seinen Pipes belegt (mit nem struct namens STARTUPINFO glaub ich). Habs auch nicht geschafft, das umzubauen.
Hier ist der Link:
http://www.3rd-evolution.de/tkrammer/docs/apipes.html
Zuletzt bearbeitet: