stdin
次のような、リダイレクトされたパイプを介してデータを取得する Windows C プログラムがあります。
./some-data-generator | ./myprogram
stdin
問題は、ブロックしない方法で読み取ることができる必要があることです。この理由は、(1) 入力がデータ ストリームであり、データ ストリームがないこと、(2) プログラムが読み取りスレッドをいつでも EOF
中止できる必要があることです。データがない場合はブロックされるため、非常に困難になります。stdin
fread
fcntl
Unix では、ファイル記述子のブロック モードをおよびで設定できるため、これは問題ありませんO_NONBLOCK
。ただし、fcntl
Windows には存在しません。
私は使用してみました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
。
他に何をすべきかわかりません。これは実際には不可能ですか (!)、それとも高度に難読化されているだけですか? ネット上のリソースは、この特定の問題についてはかなりまばらです。