linux select()详解(一)-- 使用及注意事项
来源:互联网 发布:中国网络移动经纪人 编辑:程序博客网 时间:2024/06/07 03:35
通过本文你会了解到:
1. select()原型及参数说明
2. select()应用情景
3. select()注意事项
4. select()作定时器
原型
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *utimeout);
参数说明 readfds
, writefds
, exceptfds
为所要监听的三个描述符集:
——readfds
监听文件描述符是否可读,不监听可以传入 NULL
——writefds
监听文件描述符是否可写 ,不监听可以传入 NULL
——exceptfds
监听文件描述符是否有异常,不监听可以传入 NULL
nfds
是 select()
监听的三个描述符集中描述符的最大值+1 timeout
设置超时时间
更详细信息请参考译文linux-select()
应用情景 select()
函数的重点在于它可以同时监控多个描述符(一般最大为1024),并且在描述符集中没有可操作的描述符时会进入睡眠状态。 实际应用中,若需要同时处理多个描述符的读写时,如果只是创建了一系列的read()
和write()
就会导致在有些描述符没有准备好读写时而被阻塞,这样当然不是我们期望的,因此这时就需要应用select()
。
注意事项
这段是select()
使用必须要了解和掌握的知识点,建议认真阅读,同时可以结合后续的一些实例做分析,相信你一定能掌握select()
使用方法。
nfds
必须被正确设置,一般取描述符集中描述符的最大值并加1。在非必须的情况下,尽量使用不超时的
select()
,即将utimeout
参数设置为NULL
。/*参数 timeout 置为 NULL*/select(nfds, &readfds, &writefds, &exceptfds, NULL);
timeout
的值必须在每次select()
之前重新赋值,因为操作系统会修改此值。while(1) { timeout.tv_sec = 1; timeout.tv_usec = 0; select(nfds, &readfds, &writefds, &exceptfds, &timeout);}
由于
select()
会修改字符集,因此如果select()
调用是在一个循环中,则描述符集必须被重新赋值。/*以read操作为例*/while(1) { FD_ZERO(&readfds); FD_SET(fd, &readfds); select(nfds, &readfds, NULL, NULL, NULL);}
函数
read()
,write()
,recv()
,send()
以及select()
可能会返回-1并且errno置位为EINTR,或这errno被赋值为EAGAIN(EWOULDBLOCK),这种情况需要被正确处理。如果程序中不接收任何信号,则不会得到EINTR。如果程序设为阻塞I/O,则不会收到EAGAIN。/*一般只需对EINTR进行处理就可以了,例子如下*/while(1) { ret = select(nfds, &readfds, NULL, NULL, NULL); if(ret == -1 && errno == EINTR) continue;}
- 当
read()
,write()
,recv()
和send()
返回0时建议关闭描述符并在字符集中移除此描述符(不关闭描述符并移除的话可能会导致未知错误,还是对此情况处理的好)。
定时器
在没有usleep函数的系统中,可以应用select来实现,下例中实现了0.2秒的延时:
struct timeval tv;tv.tv_sec = 0;tv.tv_usec = 200000; /* 0.2 秒*/select(0, NULL, NULL, NULL, &tv);
- linux select()详解(一)-- 使用及注意事项
- Linux中使用select()注意事项
- coordinatorLayout使用详解及注意事项
- ButterKnife使用详解及注意事项
- Linux select() 详解
- 复制学习 Linux FD_SET及select()详解
- Linux IO及 select、poll、epoll详解
- ListView嵌套GridView使用详解及注意事项
- ListView嵌套GridView使用详解及注意事项
- ListView嵌套GridView使用详解及注意事项
- ListView嵌套GridView使用详解及注意事项
- ListView嵌套GridView使用详解及注意事项
- fsck命令使用详解及特别注意事项
- Linux select()详解(转载)
- linux使用select实现精确定时器详解
- linux使用select实现精确定时器详解
- sqlite使用注意事项(一)
- [小结]select的使用注意事项
- IOS App 的图标和启动图的烦恼
- 多态程序
- leetcode_138 Copy List with Random Pointer
- Dropout 与 DropConnect
- www
- linux select()详解(一)-- 使用及注意事项
- kSumII
- cookie和session的区别
- 傅里叶变换分析
- 读书笔记-叁-《结网》
- leetcode 24 Swap Nodes in Pairs C++
- 顺序表应用5:有序顺序表归并
- 【转载】springMVC表单校验+全注解
- 深入理解Java:SimpleDateFormat安全的时间格式化(多线程应用)