windows平台/linux平台select设计差别

张开发
2026/4/19 21:46:32 15 分钟阅读

分享文章

windows平台/linux平台select设计差别
仅供自己记录学习函数原型int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timeval *timeout);1、windows(winsock)的select设计关键特性Windows 只处理 socket fd不处理普通文件 fd内核不使用 nfds 参数而是直接遍历 fd_set 里所有标记的 socket文档明确说明nfds 参数被忽略仅为了兼容 POSIX 而保留填 0、1、1000 都不影响结果2、LinuxPOSIX 标准的 select 设计关键特性nfds 要检查的最大文件描述符编号 1函数原型和 Windows 一样但语义完全不同内核会从 0 到 nfds-1 逐个扫描 fd_set 里的位判断是否就绪如果你填 nfds0内核只扫描 0~-1空范围完全跳过你设置的 serverSocket_ → 永远返回 0超时检测不到任何连接必须填 serverSocket_ 1内核才会扫描到这个监听 socket。3、为什么会有这个差异历史设计目标不同WindowsWinsock 是独立的网络 APIselect 只服务 socket不需要区分普通文件 fd所以不需要 nfds 限定范围Linuxselect 是通用 I/O 复用同时处理 socket、文件、管道、终端等所有 fd内核必须靠 nfds 限定扫描上限避免遍历整个系统 fd 表性能灾难。标准兼容 vs 原生实现Linux 严格遵循 POSIX 标准nfds 是强制有效参数Windows 为了兼容 POSIX 代码保留了参数但内部实现完全不依赖它。4、总结Windowsselect(nfds, ...) → nfds 无效填啥都行Linuxselect(nfds, ...) → nfds 必须是最大 fd1填错直接失效代码在 Linux 连不上就是因为 select(0) 让内核跳过了监听 socket。

更多文章