私は一種の、このように、リダイレクトstdin
パイプを通してデータを取得しますWindowsのCプログラムを持っている:、どのようにリダイレクトされたパイプである非ブロッキングの標準を持っている?
./some-data-generator | ./myprogram
問題は、私は非ブロッキング方式でstdin
から読み取ることができる必要があるということです。これは、(1)入力がデータストリームであり、EOF
が存在しないこと、および(2)プログラムがいつでもstdin
読み取りスレッドを中断できる必要があることです。 fread
はデータがないときにブロックするので、これは非常に困難です。
ファイルディスクリプタのブロックモードをfcntl
とO_NONBLOCK
に設定できるため、これは問題ありません。ただし、fcntl
はウィンドウに存在しません。
私は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
)で失敗します。
私は他に何をすべきかわかりません。これは実際には不可能ですか(!)、それとも非常に難読化されていますか?この特定の問題については、ネット上のリソースはむしろまばらです。
PeekNamedPipeは私が探していたものでした...これにより、ブロックしないようにReadFileを呼び出すことができます。 – paleozogt