【发布时间】:2014-04-19 00:48:06
【问题描述】:
我想检测 Windows 中的标准输入是否有输入等待。
我在 Linux 上使用以下通用结构:
fd_set currentSocketSet;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
int result = 1;
while (result > 0){
FD_ZERO(¤tSocketSet);
FD_SET(STDIN, ¤tSocketSet);
result = select(STDIN+1, ¤tSocketSet, NULL, NULL, &tv);
if (result == -1){
printf("Network Error -- select errored with id=%d.\n", errno);
return;
} else if (result > 0){
//...do stuff
}
}
注意:我不想像 kbhit 那样处理键盘和键盘功能。我想要一种方法来做我所要求的。我也不希望第三方库执行此操作,我希望通过本地 Windows 库调用来获得答案。
注意 #2:在 windows 上,上面的代码失败,出现 windows 错误代码 10038“尝试对不是套接字的东西进行操作”,这可能意味着 windows 不支持在 STDIN 上选择。
【问题讨论】:
-
我们假设这是一个控制台应用程序吗?
-
好吧,我不了解Linux,所以我不知道您发布的代码在做什么。但根据我对这个问题的理解,
ReadConsoleInput函数应该可以工作。您必须手动调用它,它不会给您通知。GetNumberOfConsoleInputEvents和PeekConsoleInput也是选项。 -
在 Linux 中,
select()对文件描述符进行操作,包括套接字、stdin/out 等。在 Windows 上,select()仅对套接字起作用,没有别的。您不能在 Windows 上将stdin传递给select()。