【发布时间】:2010-10-26 14:11:00
【问题描述】:
我有一个 Windows C 程序,它通过重定向的 stdin 管道获取其数据,有点像这样:
./some-data-generator | ./myprogram
问题是我需要能够以非阻塞方式读取stdin。这样做的原因是(1)输入是数据流并且没有EOF 和(2)程序需要能够随时中止其stdin-读取线程。 fread 在没有数据时阻塞,所以这很困难。
在 Unix 中这没有问题,因为您可以使用 fcntl 和 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) 而失败。
我不知道还能做什么。这实际上是不可能的(!)还是只是高度模糊?对于这个特定的问题,网络上的资源相当稀少。
【问题讨论】: