c++ - 在 Windows 中,如何拥有作为重定向管道的非阻塞标准输入?

标签 c++ c windows stdin pipe

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

./some-data-generator | ./myprogram

问题是我需要能够以非阻塞方式从 stdin 读取。这样做的原因是 (1) 输入是数据流并且没有 EOF 和 (2) 程序需要能够中止其 stdin 读取线程在任何时候。 fread 会在没有数据时阻塞,因此这使得它变得非常困难。

在 Unix 中这不是问题,因为您可以使用 fcntlO_NONBLOCK 设置文件描述符的阻塞模式。但是,Windows 上不存在 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)。

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

最佳答案

顺序方法,检查输入是否准备好读取:

  • 对于控制台模式,您可以使用 GetNumberOfConsoleInputEvents()。
  • 对于管道重定向,您可以使用 PeekNamedPipe()

关于c++ - 在 Windows 中,如何拥有作为重定向管道的非阻塞标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870167/

相关文章:

c - 需要一些关于简单 C 代码程序的建议

java - 用c++编写的电话应用程序

c++ - fstream 未创建文件名后附加了 asctime 值的文件

c++ - 派生自并合成相同的类。 C++

c - 使用信号量系统 V 的 Scanf 和 printf

c++ - cudaMemcpyToSymbol : zero value in __constant__ variable

c++ - 快速解析文件?

windows - 如何唯一标识计算机上的操作系统?

c++ - WSAStringToAddress 失败

python - Python Windows 启动器 (Python 3.3/PEP 397) 向后兼容吗?