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