Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何判断fgets(stdin)是否会在Windows上阻塞?_C_Windows_Io_Console Application - Fatal编程技术网

C 如何判断fgets(stdin)是否会在Windows上阻塞?

C 如何判断fgets(stdin)是否会在Windows上阻塞?,c,windows,io,console-application,C,Windows,Io,Console Application,如何判断对fgets(stdin,…)的下一次调用是否会阻塞?换句话说,我如何判断stdin缓冲区是否有一个换行等待读取 在Unix上,我知道我可以像这样使用select(): fd_set reads; FD_ZERO(&reads); FD_SET(fileno(stdin), &reads); int s = select(fileno(stdin)+1, &reads, 0, 0, 0); if (s) {

如何判断对
fgets(stdin,…)
的下一次调用是否会阻塞?换句话说,我如何判断
stdin
缓冲区是否有一个换行等待读取

在Unix上,我知道我可以像这样使用
select()

    fd_set reads;
    FD_ZERO(&reads);
    FD_SET(fileno(stdin), &reads);
    int s = select(fileno(stdin)+1, &reads, 0, 0, 0);
    if (s) {
        //fgets is ready
    }
但是,Windows上的
select()
仅适用于套接字,而不适用于“stdin”,因此我无法使用它

我还知道在Unix上我可以使用
poll()
ioctl(0,I\u NREAD…
,可能还有很多其他解决方案。这些都不能在Windows上工作

我已经尝试了
kbhit()
WaitForSingleObject(GetStdHandle(STD\u INPUT\u HANDLE))
。问题在于,这两种方法都表明,只要按下第一个键,输入就可用。我需要知道是否有整行可用,因为
fgets()
会阻塞整行

也许我的问题是Unix shell倾向于缓冲整个输入行,而Windows则没有

我是否应该使用
fgetc()
建立一个缓冲区,直到看到换行符

我做过研究,找到了其他答案,但没有一个对我有用。他们要么使用C++,要么我需要C解决方案。或者他们正专注于将
fgets()
与套接字一起使用,我需要将其与
stdin
一起使用

非常感谢您的帮助。谢谢

如何判断对
fgets(stdin,…)
的下一次调用是否会阻塞?换句话说,我如何判断
stdin
缓冲区是否有一个换行等待读取

一般来说,你不知道。也不是在POSIX系统上,没有做一些假设。POSIX和Windows API都定义了确定输入是否可用的机制,但这还不够。您需要确定是否可以读取特定数据(即行终止符),C定义的唯一方法是读取数据

因此,如果您确实需要在不阻塞主线程的情况下一次读取一行,那么我建议异步执行读取。您可以使用独立于主线程的阅读器线程来运行自己的线程,但您可能会发现它支持您的需求

如何判断对
fgets(stdin,…)
的下一次调用是否会阻塞?换句话说,我如何判断
stdin
缓冲区是否有一个换行等待读取

一般来说,你不知道。也不是在POSIX系统上,没有做一些假设。POSIX和Windows API都定义了确定输入是否可用的机制,但这还不够。您需要确定是否可以读取特定数据(即行终止符),C定义的唯一方法是读取数据


因此,如果您确实需要在不阻塞主线程的情况下一次读取一行,那么我建议异步执行读取。您可以使用独立于主线程的reader线程来运行自己的线程,但您可能会发现它支持您的需要。

在Linux上,学习更喜欢旧线程。。。顺便说一句,
fileno(stdin)
可以替换为
stdin\u fileno
,正好是0。另外,在病理情况下,
select
poll
会告诉您stdin是可读的,但是
fgets
仍然可以考虑在Linux上使用。它已经被移植到Windows中,以感谢您的评论,但我真的尝试在Windows上这样做。我也不能引入依赖项,但我会在将来的项目中记住这一点。因为它是自由软件,你可以在Linux上学习它的源代码,学会更喜欢旧的。。。顺便说一句,
fileno(stdin)
可以替换为
stdin\u fileno
,正好是0。另外,在病理情况下,
select
poll
会告诉您stdin是可读的,但是
fgets
仍然可以考虑在Linux上使用。它已经被移植到Windows中,以感谢您的评论,但我真的尝试在Windows上这样做。我也不能引入依赖项,但我会在将来的项目中记住这一点。因为它是自由软件,所以你可以研究它的源代码