3

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

4

2 回答 2

1

建议使用套接字 I/O 例程,最好将 poll() 所需的毫秒作为超时,最终您可以将超时(返回值 = -1)解释为输入缓冲区中的数据不可用。
在我看来,没有非阻塞的标准 I/O 函数来实现这个功能。

于 2010-04-29T10:39:23.237 回答
0

我不确定您在说什么:套接字还是文件句柄?

对于文件,不应有阻塞。该函数立即返回(除了 I/O 调用本身)。

对于套接字 - 您可以使用该ioctlsocket函数:以下说明是否有 rcv 数据待处理:

ULONG nSize;
ioctlsocket(sock, FIONREAD, &nSize);

以下将套接字转换为非阻塞模式:

ULONG nEnable = 1;
ioctlsocket(sock, FIONBIO, &nEnable);

在非阻塞模式下 - 套接字上的功能永远不会阻塞。如果他们不能满足请求,他们会返回一个错误,错误代码是WSAEWOULDBLOCK

此外,在 Windows 上还有许多更有效的方法。那些是:

  • 使用重叠 I/O。这是不平凡的,但提供了卓越的性能
  • 将套接字与等待事件相关联。这会将套接字转换为非阻塞模式,并在发生网络事件时发出指定事件的信号。
  • 将其与窗口句柄相关联。这对于面向 UI 的程序很方便。
于 2010-04-29T15:07:53.107 回答