8

我有一个 Windows C 程序,它通过重定向stdin管道获取数据,有点像这样:

./some-data-generator | ./myprogram

问题是我需要能够以stdin非阻塞方式读取。这样做的原因是(1)输入是一个数据流并且没有EOF,(2)程序需要能够随时中止它的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) 而失败。

我不确定还能做什么。这实际上是不可能的(!)还是只是高度模糊?对于这个特定问题,网络上的资源相当稀少。

4

2 回答 2

4

订单方法,检查是否有可供阅读的输入:

  • 对于控制台模式,您可以使用 GetNumberOfConsoleInputEvents()。
  • 对于管道重定向,您可以使用 PeekNamedPipe()
于 2009-05-16T19:50:03.077 回答
1

您可以使用异步 I/O 从句柄中读取,例如 ReadFileEx() WIN32 调用。使用 CancelIo() 在没有输入的情况下终止读取。

请参阅位于http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx的 MSDN

于 2009-05-15T20:55:04.990 回答