我只是想知道在C中是否可以查看输入缓冲区或执行类似的技巧来了解对fgets的调用是否会在以后阻塞。 Java允许通过调用BufferedReader.ready()来做类似的事情,这样我就可以实现这样的控制台输入:
while (on && in.ready()) {
line = in.readLine();
/* do something with line */
if (!in.ready())
Thread.sleep(100);
}
这允许外部线程通过设置为false来正常关闭输入循环;我想在不使用非便携技巧的情况下在C中执行类似的实现,我已经知道我可以通过使用信号或(更好,即使需要处理缓冲)重新实现,在unix下制作“超时fgets”它在recv / select之上,但我更喜欢可以在windows上运行的东西。
TIA
答案 0 :(得分:1)
建议使用套接字I / O例程,最好是poll(),并将所需的毫秒作为超时,最后你可以将timeout(返回值= -1)解释为输入缓冲区中数据不可用。
在我看来,没有非阻塞的标准I / O功能来实现这个功能。
答案 1 :(得分:0)
我不确定你在说什么:套接字或文件句柄?
对于文件,应该没有阻止。该函数立即返回(除了I / O调用本身)。
对于套接字 - 您可以使用ioctlsocket
函数:
以下说明是否存在未决的rcv数据:
ULONG nSize;
ioctlsocket(sock, FIONREAD, &nSize);
以下将套接字转换为非阻塞模式:
ULONG nEnable = 1;
ioctlsocket(sock, FIONBIO, &nEnable);
当处于非阻塞模式时 - 套接字上的函数永远不会阻塞。如果他们无法满足请求,则会返回错误,错误代码为WSAEWOULDBLOCK
另外,在Windows上有几十种更有效的方法。那些是: