【问题标题】:Select() with Non-Blocking I/O and Select() with Blocking I/O in socket使用非阻塞 I/O 的 Select() 和使用套接字中的阻塞 I/O 的 Select()
【发布时间】:2015-10-07 09:57:30
【问题描述】:

我正在尝试理解 select() 和非阻塞 I/O 概念。 但仍然不知道如果使用阻塞 I/O 和 select() 会发生什么,如果使用非阻塞和 select() 会发生什么。

我读到,select() 已经是块调用。那么它是如何工作的呢?

【问题讨论】:

    标签: sockets select nonblocking


    【解决方案1】:

    如果将阻塞 I/O 与 select() 一起使用会发生什么

    您将收到IllegalBlockingModeException.

    select() 已经是块调用。那么它是如何工作的呢?

    它会一直阻塞,直到正在选择的事件发生或超时到期(如果有)。

    【讨论】:

    • 至少在 UNIX 系统上,将 select 与阻塞套接字一起使用是完全有效的,并且将 select 与完全不支持异常的 C 等语言一起使用也是完全有效的。也许您描述的行为是 Java 特有的。
    • 不知何故,答案假定为 Java,问题中未指定。
    • 感谢您的解释。但还是有些疑惑。我无法清除阻塞和非阻塞上下文。 1) 如果使用带 select 的多个客户端阻塞读/写或使用 select() 不阻塞有什么区别?
      2) 如果在 BSD 中使用带 select 或不带 select 的阻塞或非阻塞,我会在哪里遇到问题c中的套接字
    【解决方案2】:

    select()poll() 与阻塞或非阻塞套接字一起使用非常好。对select() 的调用将被阻止,直到提供给select() 的(其中一个)套接字可供读取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      相关资源
      最近更新 更多