Linux中使用select()注意事项

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在进行程序开发时,有时候需要阻塞,但同时又需要有超时功能,这时候select()函数就能很好的满足我们的要求:

但用这进行测试时有一个地方是需要注意的,即select()的第五个参数timeval *timeout的问题。设置好timeout的始值后,如果只对select()调用一次,是没有任何问题的,但一旦多次调用,你就会发现怎么好像我设置的timeout值只有第一次有用呢,以后select()总是一刻也不等就返回了呢?

通过查看man和自己测试,原来select()函数内部是会不断更新timeout的值的,以查看超时时间还剩多少。那么第一次调用之后,timeout的值就被更新至0了,以后不管你再调用它多少次,select()都会立即返回了,这就是为什么会出现在多次调用时,select()只有第一次时凑效的缘由了,哈哈,以后再使用它时,要尤其注意这一点了。但它的兄弟函数pselect()没有它的这个问题,它不会在内部在时间值进行更新的。

select() 的 timeout 陷阱 调用 select() 的 timeout 会倾向于在循环外部进行赋值,以降低不必要的 CPU 消耗,关于 select() timeout 上的用法陷阱,很多资深的平台移植人员也掉进过,在 FreeRTOS 平台调用 select,timeout 的值在调用前后保持不变,但任何的处理都是要花费时间的,当 select() 第一次调用完成再次进入循环体时,这个 timeout 的值已经背更新为”剩下的时间“,如 9 秒,这个时候,select() 调用的设计不再符合设计者的初衷, 阅读详情

相关推荐

SOCKET编程中,select()函数的作用

    select()在SOCKET编程中还是比较重要的,可是对于初学SOCKET的人来说都不太爱用select()写程序,他们只是习惯写诸如 conncet()、accept()、recv()或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用select()

韦编二绝 2254

小问题·select 一直返回 0 的几种原因

select使用的注意细节

m0_64560763的博客 4816

V4L2调用相机select timeout一种可能的原因

linux调用相机出现select timeout错误,有可能是相机(尤其是USB2.0相机)插在2.0接口上时,端口供电能力不足。如果排查了其他问题还没有解决,可以看看有没有这个端口的问题。        V4L2的select函数的最后一个参数是timeout,timeout是用来设置超时时间的,设置了timeout以后,如果select在没有文件描述符监视可用的情况下,会等待这个time

zilanpotou182的博客 1万+

select函数的阻塞和非阻塞态理解(实践总结)

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); 返回值: <0:select错误 >0:有可读写或出错文件,个数为返回值个数 0:等待超时,没有可读写或错误的文件 select函数的阻塞和非阻塞主要看最后一个参数 timeout超时时间的值,timeout的取值决定了select的三种状态: 1、timeout传........

modi000的博客 1万+

linux select()详解(一)-- 使用注意事项

通过本文你会了解到: 1. select()原型及参数说明 2. select()应用情景 3. select()注意事项 4. select()作定时器

保持住思维的鲜活,才能充满活力。 5156

Linux网络编程--select()和pselect()函数

函数select()与之前的recv()和send()直接操作文件描述符不同。使用select()函数可以先对需要操作的文件描述符进行查询,查看是否目标文件描述符可以进行读、写或者错误操作,然后当文件描述符满足操作的条件的时候才进行真正的IO操作。函数select()是用一种超时轮循的方式来查看文件的读写错误可操作性。在Linux下,还有一个相似的函数pselect()。函数select()和pselect()用于IO复用,它们监视多个文件描述符的集合,判断是否有符合条件的时间发生。...

木牛的博客 1039

select poll使用

  select poll使用     ...

weixin_33991727的博客 88

select 设置发送超时发送注意事项

http://www.cnitblog.com/guopingleee/archive/2008/11/26/51889.html select 设置发送超时发送注意事项 //设置发送超时 你只发送, 并发送足够多的数据以填满发送缓冲区, 接收端一直不接收. 发送端一量满发送缓冲区就会阻塞, 如果你设置了发送超时, 超时到了它就会返回发送超时了. 在send(),rec

cjsycyl的专栏 4456

Linux 下的定时器(1)

        今天博客开张了,现在准备工作了——实习阶段,发现中国的那句俗话“啥玩意不会”,但是越是这样越发现每天学会的东西很多,今天把前两天要写的关于linux下的定时器的一些东西写一下。      linux下的器定时作用的函数很多,比如常用的sleep()函数,这里不再过多说这个。主要说的关于定时器精度和循环定时器的应用,尤其是在多线程应用过程中所要注意的定时器问题。 1. a

spike8800的专栏 1540

select()之文件描述符集合操作

摘要:fd_set是Linux系统中用于I/O多路复用的关键数据结构,通过位图数组管理文件描述符。它包含16个64位元素(32位系统为32个32位元素),最多支持1024个描述符。核心操作包括FD_ZERO(清空集合)、FD_SET(添加描述符)、FD_CLR(移除描述符)和FD_ISSET(检查状态)。这些宏通过位运算实现,如FD_SET将对应位置1。使用select()时需注意其1024描述符限制和性能问题,现代系统推荐使用epoll或kqueue替代。

pl0020的博客 451
上一篇: vc++6.0使用串口控件例程
下一篇: 用setsockopt()来控制recv()与send()的超时
newger
博客等级 码龄19年 15粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值