stdin次のような、リダイレクトされたパイプを介してデータを取得する Windows C プログラムがあります。
./some-data-generator | ./myprogram
stdin問題は、ブロックしない方法で読み取ることができる必要があることです。この理由は、(1) 入力がデータ ストリームであり、データ ストリームがないこと、(2) プログラムが読み取りスレッドをいつでも EOF中止できる必要があることです。データがない場合はブロックされるため、非常に困難になります。stdinfread
fcntlUnix では、ファイル記述子のブロック モードをおよびで設定できるため、これは問題ありませんO_NONBLOCK。ただし、fcntlWindows には存在しません。
私は使用してみましたSetNamedPipeHandleState:
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
ERROR_ACCESS_DENIEDしかし、これは( )で失敗します0x5。
他に何をすべきかわかりません。これは実際には不可能ですか (!)、それとも高度に難読化されているだけですか? ネット上のリソースは、この特定の問題についてはかなりまばらです。