8

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

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

4

2 に答える 2

4

注文のアプローチ、読む準備ができている入力があることを確認してください:

  • コンソールモードの場合は、GetNumberOfConsoleInputEvents()を使用できます。
  • パイプのリダイレクトには、PeekNamedPipe()を使用できます
于 2009-05-16T19:50:03.077 に答える
1

ReadFileEx() WIN32 呼び出しなど、非同期 I/O を使用してハンドルから読み取ることができます。入力がない場合に読み取りを終了するには、CancelIo() を使用します。

http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspxで MSDN を参照してください。

于 2009-05-15T20:55:04.990 に答える