检查fgets是否会阻止

时间:2010-04-29 09:07:32

标签: c++ c input nonblocking fgets

我只是想知道在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

2 个答案:

答案 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上有几十种更有效的方法。那些是:

  • 使用重叠I / O.这非常重要,但性能优越
  • 将套接字与可等待的事件相关联。这会将套接字转换为非阻塞模式,并在发生网络事件时发出指示事件的信号。
  • 将其与窗口句柄关联。这对于面向UI的程序很方便。