Ich habe ein Windows-C-Programm, das seine Daten über ein umgeleitet stdin
Rohr, Art wie diese bekommt:in den Fenstern, wie nicht-blockierenden stdin zu haben, die ein umgeleiteten Rohr?
./some-data-generator | ./myprogram
Das Problem ist, dass ich in die Lage sein zu lesen, von stdin
in einer nicht blockierenden Weise. Der Grund dafür ist, dass (1) die Eingabe ein Datenstrom ist, und es gibt keine EOF
und (2) das Programm muss in der Lage sein, seinen stdin
-reading Faden jederzeit abgebrochen werden. fread
Blöcke, wenn es keine Daten gibt, so ist es dadurch sehr schwierig.
In Unix ist dies kein Problem, da Sie den Blockierungsmodus eines Dateideskriptors mit fcntl
und O_NONBLOCK
festlegen können. fcntl
ist jedoch nicht in Windows vorhanden.
Ich versuchte SetNamedPipeHandleState
mit:
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
aber nicht mit ERROR_ACCESS_DENIED
(0x5
).
Ich bin mir nicht sicher, was anderes zu tun. Ist das wirklich unmöglich (!) Oder ist es nur stark verschleiert? Die Ressourcen im Netz sind für dieses spezielle Problem eher spärlich.
PeekNamedPipe war das, was ich suchte ... Auf diese Weise können Sie dann ReadFile- nennen, so dass sie nicht blockiert. – paleozogt