您的位置:首页 > 运维架构 > Linux

为什么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

         这很好理解!

         来, 看个代码, 就去上班:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: