2009-05-15 11 views
6

私は一種の、このように、リダイレクトstdinパイプを通してデータを取得しますWindowsのCプログラムを持っている:、どのようにリダイレクトされたパイプである非ブロッキングの標準を持っている?

./some-data-generator | ./myprogram 

問題は、私は非ブロッキング方式でstdinから読み取ることができる必要があるということです。これは、(1)入力がデータストリームであり、EOFが存在しないこと、および(2)プログラムがいつでもstdin読み取りスレッドを中断できる必要があることです。 freadはデータがないときにブロックするので、これは非常に困難です。

ファイルディスクリプタのブロックモードをfcntlO_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_DENIED0x5)で失敗します。

私は他に何をすべきかわかりません。これは実際には不可能ですか(!)、それとも非常に難読化されていますか?この特定の問題については、ネット上のリソースはむしろまばらです。

答えて

3

でMSDNを参照してください:

  • コンソールモードの場合、あなたは)(GetNumberOfConsoleInputEventsを使用することができます。パイプのリダイレクトについては
  • は、あなたがPeekNamedPipeを使用することができます()は、ハンドルが匿名パイプにある場合は動作しません
+0

PeekNamedPipeは私が探していたものでした...これにより、ブロックしないようにReadFileを呼び出すことができます。 – paleozogt

1

非同期入出力を使用して、ReadFileEx()WIN32呼び出しなどのハンドルから読み取ることができます。 CancelIo()を使用して、入力がなければ読み込みを終了します。

が読みレディ入力がある確認し、注文apprach http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx

+1

- それはたとえば、質問に与えるになりますよう。オーバーラップ(非同期)I/Oは匿名パイプでは不可能です。 –

関連する問題