【问题标题】:Is it necessary to use non-blocking file descriptors with IO multiplexing?IO多路复用是否需要使用非阻塞文件描述符?
【发布时间】:2017-09-28 03:45:02
【问题描述】:

Posix 支持阻塞和非阻塞文件描述符。第二个可以用O_NONBLOCK 标志打开。我的应用程序中有一个主循环,它轮询POLLINPOLLOUT 事件的一些文件描述符集(poll sys 调用)。我还可以使用阻塞文件描述符吗,因为我只在设置了POLLOUT 时才写入,而只在设置了POLLIN 时才读取?

【问题讨论】:

    标签: c unix io network-programming posix


    【解决方案1】:

    根据 poll(2) 手册页:

    POLLOUT 现在可以进行写入了,尽管大于套接字或管道中可用空间的写入仍然会阻塞(除非设置了 O_NONBLOCK)。

    换句话说:如果与此 fd 关联的内核缓冲区中没有足够的空间,则写入一块大于缓冲区中可用空间的数据块将阻塞。如果有可用空间,它们的行为相同。

    因此,您必须将所有文件描述符设置为非阻塞,尤其是 TCP 套接字,因为如果另一端的进程连接速度较慢,您可能会遇到阻塞写入调用,直到客户端不会向您发送所有 ACK每个 IP 包。

    【讨论】:

    • 阅读也可能是个问题,至少在 Linux 中是这样。请参阅this kernel mailing list thread,它被报告为错误。内核开发人员说,不管 POSIX 的字面意思如何,都不会改变,你应该使用O_NONBLOCK
    • @WumpusQ.Wumbley:这个错误最终被修复了。
    • @R.. 哇,考虑到邮件列表线程中讨论的基调,这真是令人惊讶。但我想 13 年可以改变任何事情。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多