【问题标题】:Do I correctly understand working of asynchronous blocking I/O select() function?我是否正确理解异步阻塞 I/O select() 函数的工作原理?
【发布时间】:2014-04-13 13:53:58
【问题描述】:

比如这里(http://cs.brown.edu/courses/cs168/f12/handouts/async.pdf)是这样说的:

select() 的工作原理是阻塞直到文件描述符(它可以代表一个实际的 文件、管道或网络套接字)。什么是“东西”?数据进来,能够写入文件 描述符,或者超时——你告诉 select() 你想被什么唤醒。 大多数基于 select() 的服务器都是围绕一个事件循环构建的,该循环由以下内容组成: 1) 用你想知道的文件描述符填充一个 fd 集合结构,当数据进入时。 2) 用你想知道什么时候可以写的文件描述符填充一个 fd 集合结构。 3) 调用 select() 并阻塞直到发生某些事情。 4) 一旦 select() 返回,检查你的文件描述符是否是你醒来的原因。如果是这样, 以服务器需要的任何特定方式“服务”该文件描述符。 永远重复这个过程。

我是否正确理解,例如,我有四个套接字的列表,我想从中读取。我通过一个select()这个列表,然后调用这个函数。它等待一段时间,然后返回我准备好读取数据的套接字。我读取了这些数据,然后再次调用 select() 等等。我只是想想象一下原理,例如,如果四个客户端同时将任何图像发送到这样的服务器,它会是什么样子。谢谢!

【问题讨论】:

  • 不确定我是否理解您的问题。网络服务器使用带有(通常)TCP 协议的套接字。它是如何工作的究竟是什么意思?
  • 同时是一个强词。它们可能不会同时到达服务器,但即使它们到达,这意味着您的所有文件描述符都可以读取。所以你可以从所有这些中读取并调用 select()。你发现了什么问题?
  • 感谢您的帮助!我几乎开始明白了。但是,如果我有三个文件描述符,它们都已准备好进行 I/O。 Select() 是否返回我注意到所有这些描述符都准备好了并且我可以处理它们或者它返回我第一个准备好的描述符?

标签: sockets select asynchronous io blocking


【解决方案1】:

但如果我有三个文件描述符,它们都已准备好进行 I/O。 Select() 是否让我注意到所有这些描述符都准备好了 我可以处理它们还是返回第一个准备好的描述符?

man select

退出时,集合被修改以指示哪个文件 描述符实际上改变了状态。

注意复数:descriptors。 (实际上,这不太正确,因为文件描述符不需要更改 状态 - 当调用 select() 时它们可能已经准备好了。)所以,select() 返回所有准备好的描述符.

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 2015-09-01
    • 1970-01-01
    • 2012-02-08
    • 2014-04-27
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多