You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux系统调用select返回后,write无阻塞的写入阈值及设置位置

Linux select系统调用writefds就绪后的非阻塞写入负载问题

当为Linux系统调用select提供有效的文件/套接字writefds且其返回后,后续调用write不会阻塞的写入负载大小是多少?例如是1B/1kB/1MB还是其他阈值?该阈值设置在何处?

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

核心结论

select返回writefds就绪时,仅保证至少能写入1字节而不阻塞,不存在固定的1kB/1MB这类阈值。

具体场景说明

  • 套接字场景:
    套接字的writefds就绪,本质是其发送缓冲区有至少1字节的空闲空间。但空闲空间的具体大小完全取决于当前网络状态、对端接收情况以及缓冲区的实时使用情况,没有固定值。你不能假设能写入超过1字节的内容而不阻塞,实际可写入的字节数可能随时变化。
  • 普通文件场景:
    普通文件的写入通常不会阻塞(除非是管道、FIFO这类特殊文件或处于锁定等特殊状态),此时select返回writefds就绪后,理论上可以写入任意大小,但这是文件系统的特性,和select本身的逻辑无关。

相关参数设置

不存在全局的固定写入阈值,但可以通过以下方式调整相关参数:

  • 套接字的发送缓冲区总大小可通过SO_SNDBUF选项,调用setsockopt函数设置:
    int buf_size = 1024 * 1024; // 1MB
    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &buf_size, sizeof(buf_size));
    
    注意:这是缓冲区的总容量,不是select就绪后能写入的大小。如果想获取当前可写入的具体字节数,可以使用ioctl的FIONWRITE命令:
    int available;
    ioctl(sockfd, FIONWRITE, &available);
    
    此时available的值就是当前无需阻塞就能写入的字节数。

内容的提问来源于stack exchange,提问作者user3882729

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:57:08