我有一个 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
) 而失败。
我不确定还能做什么。这实际上是不可能的(!)还是只是高度模糊?对于这个特定问题,网络上的资源相当稀少。