我有一个 Windows C 程序,它通过重定向的 stdin
管道获取数据,有点像这样:
./some-data-generator | ./myprogram
问题是我需要能够以非阻塞方式从 stdin
读取。这样做的原因是 (1) 输入是数据流并且没有 EOF
和 (2) 程序需要能够中止其 stdin
读取线程在任何时候。 fread
会在没有数据时阻塞,因此这使得它变得非常困难。
在 Unix 中这不是问题,因为您可以使用 fcntl
和 O_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/