背景问题:在 TCP 客户端同时处理标准输入和 TCP 套接字的场景下,可能会出现阻塞问题。具体来说,当客户端程序调用 fgets 或其他标准输入读取函数时,如果标准输入没有数据,客户端会被阻塞在读取操作上。这种情况下,即使服务器已经通过 TCP 向客户端发送了 FIN(表示 TCP 连接已经关闭),客户端也无法立即感知到这个 EOF,因为它仍然在等待标准输入的数据。这就会导致客户端无法及时处理服务器发送的关闭信息,可能造成客户端响应延迟或者服务器端进程挂起甚至被杀掉,从而影响程序的正常运行。换句话说,阻塞在一个输入源上会使客户端“看不见”另一个输入源的数据变化,从而带来了同步和可靠性的问题,这正是多路 I/O 复用出现的背景和必要性所在。
大白话就是单个处理时数据不来的时候就卡住,所以用I/O复用同时监控多个描述符
所以就有了select和epoll等函数,epoll是主流,select的局限是有描述符上限,FD_SETSIZE通常是1024,需要每次都重建fd_set,O(n)扫描
int poll(struct pollfd *fdarray, nfds_t nfds, int timeout);
浙公网安备 33010602011771号