为什么linux select函数的第一个参数总应该是fdmax + 1 ?
2017-06-23 08:28
633 查看
先说明一下, 在Windows中, 并不要求select函数的第一个参数总应该是fdmax + 1, 那linux中为什么又是呢?
这就涉及到linux select第一个参数的函数: 待测试的描述集的总个数。 但要注意, 待测试的描述集总是从0, 1, 2, ...开始的。 所以, 假如你要检测的描述符为8, 9, 10, 那么系统实际也要监测0, 1, 2, 3, 4, 5, 6, 7, 此时真正待测试的描述符的个数为11个, 也就是max(8, 9, 10) + 1
这很好理解!
来, 看个代码, 就去上班:
这就涉及到linux select第一个参数的函数: 待测试的描述集的总个数。 但要注意, 待测试的描述集总是从0, 1, 2, ...开始的。 所以, 假如你要检测的描述符为8, 9, 10, 那么系统实际也要监测0, 1, 2, 3, 4, 5, 6, 7, 此时真正待测试的描述符的个数为11个, 也就是max(8, 9, 10) + 1
这很好理解!
来, 看个代码, 就去上班:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<sys/time.h> #include<sys/types.h> int main() { struct timeval tv; // 超时时间 tv.tv_sec = 10; tv.tv_usec = 500; // 注意单位是微秒 fd_set rdfds; FD_ZERO(&rdfds); // 描述集初始化 FD_SET(STDIN_FILENO, &rdfds); // STDIN_FILENO是标准输入, 塞入描述集 FD_SET(STDOUT_FILENO, &rdfds); // STDOUT_FILENO是标准输入, 塞入描述集 int iRet = select(STDIN_FILENO + 1, &rdfds, NULL, NULL, &tv); // 注意注意 if(iRet < 0) { printf("selcet error, iRet %\n", iRet); return -1; } if(0 == iRet) { printf("timeout \n"); } printf("iRet = %d \n", iRet); return 0; }
相关文章推荐
- select函数的第一个参数为什么是最大描述符加1呢
- 为什么select使用时第一个参数要加1
- Linux下,添加了#include 的文件编译时为什么要加 -ml ,gcc 加参数 -ml 是起什么作用呢
- linux下request.getInputStream()接收的参数为空,windows下没有这个问题,为什么?
- oracle读书笔记--在linux系统上装oracle为什么要修改操作系统的核心参数
- 为什么你应该放弃 Windows10 而选择 Linux
- 在linux系统上装oracle为什么要修改操作系统的核心参数
- 为什么应该在 Linux 上使用命名管道 | Linux 中国
- Linux下,添加了#include 的文件编译时为什么要加 -ml ,gcc 加参数 -ml 是起什么作用呢
- 编写一个函数 int count_chars(char const *str,char const *chars) 函数应该在第一个参数中进行查找, 并返回匹配第二个参数所包含的字符的数量。
- 为什么Python类的方法需要加self作为第一个参数?
- 为什么我们不应该接受低劣的Linux移植游戏
- 为什么应该在 Linux 上使用命名管道
- C为什么要把数组类型的函数参数认为是指向数组第一个元素的指针
- 为什么 Linux 用户应该试一试 Rust
- j2ee程序员应该掌握的linux知识(转贴来自http://blog.csdn.net/yzhz)
- 页面传递参数,传第一个值用?传第二个用&
- j2ee程序员应该掌握的linux知识
- Linux 中 RPM 命令参数使用详解
- 为什么C#不支持函数默认参数呢