在 Linux 上,select() 如何确定何时可以无阻塞地写入 TCP/IP 连接?
On Linux, how does select() determine when a TCP/IP connection can be written to without blocking?
来自 select() 的联机帮助页:
those in writefds will be watched to see if a write will not block
对于与 TCP/IP 连接关联的文件描述符,select() 函数如何确定何时可以无阻塞地写入连接?另一种表达我的问题的方式也是,select() 将 return 指示可以无阻塞地写入文件描述符的条件是什么?
我假设如果发送缓冲区已满,select() 将不会 return fd_set 中的 fd。如果属实,这是唯一的考虑因素吗?我可以想象许多可能的标准来确定写入是否应该阻塞,所以我很想知道它在 Linux.
上的具体工作原理
当发送缓冲区中有space时,表示FD可写。没有其他的考虑。
连接时,这包括连接完成的情况,因为此时发送缓冲区已有效分配。
如果您写入数据,它们不会立即传输到对等方,但它们会首先存储在套接字缓冲区中。然后内核从套接字缓冲区中取出数据并传输它们。根据传输协议,数据可能会尽可能快地传输 (UDP),或者有一些流量控制会导致数据保留在发送方端,直到发送方确认它们 (TCP)。如果有太多未确认的数据,它将停止处理套接字缓冲区内的数据,然后缓冲区将开始填满。一旦缓冲区中不再有 space,写入就会阻塞。一旦套接字缓冲区中再次有足够的 space 写入将可能再次发生,这将在 select.
内发出信号
来自 select() 的联机帮助页:
those in writefds will be watched to see if a write will not block
对于与 TCP/IP 连接关联的文件描述符,select() 函数如何确定何时可以无阻塞地写入连接?另一种表达我的问题的方式也是,select() 将 return 指示可以无阻塞地写入文件描述符的条件是什么?
我假设如果发送缓冲区已满,select() 将不会 return fd_set 中的 fd。如果属实,这是唯一的考虑因素吗?我可以想象许多可能的标准来确定写入是否应该阻塞,所以我很想知道它在 Linux.
上的具体工作原理当发送缓冲区中有space时,表示FD可写。没有其他的考虑。
连接时,这包括连接完成的情况,因为此时发送缓冲区已有效分配。
如果您写入数据,它们不会立即传输到对等方,但它们会首先存储在套接字缓冲区中。然后内核从套接字缓冲区中取出数据并传输它们。根据传输协议,数据可能会尽可能快地传输 (UDP),或者有一些流量控制会导致数据保留在发送方端,直到发送方确认它们 (TCP)。如果有太多未确认的数据,它将停止处理套接字缓冲区内的数据,然后缓冲区将开始填满。一旦缓冲区中不再有 space,写入就会阻塞。一旦套接字缓冲区中再次有足够的 space 写入将可能再次发生,这将在 select.
内发出信号