社区
C语言
帖子详情
select于sleep
jqx_ah
2008-11-02 08:28:44
一直 以为 select(0,NULL,NULL,NULL,&timeout2)//timeout2.tv_sec=1;timeout2.tv_usec=0;
于sleep(1)相同~
今天编程 遇到一系列怪事~!
谁来接分 顺便给我个总结性的解释~ 谢谢
...全文
530
11
打赏
收藏
select于sleep
一直 以为 select(0,NULL,NULL,NULL,&timeout2)//timeout2.tv_sec=1;timeout2.tv_usec=0; 于sleep(1)相同~ 今天编程 遇到一系列怪事~! 谁来接分 顺便给我个总结性的解释~ 谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jqx_ah
2008-11-03
打赏
举报
回复
[Quote=引用 10 楼 zjl_1026_2001 的回复:]
楼主应该明白select是一种阻塞式的信号轮询操作,timeout设定的是最大的阻塞等待时间,也就是说,在timeout规定的时间范围内没有信号产生的话,select就会返回,但是如果还没有到timeout设定的时间就有信号产生的话,select同样也会返回。
举个例子,如果timeout设置为10s,而5s时就发生了一个有网络数据包到来的信号,那么select在5s时就会返回,但如果10s内一直没有的话,那就等到10s返回。
再看sleep,sleep其实是占用了c…
[/Quote]
~~ 你说的都对, 可能是我没有表达清楚我的问题~ 在没有键盘输入的情况下,
select(0,NULL,NULL,NULL,&timeout2)//timeout2.tv_sec=1;timeout2.tv_usec=0; 效果 也散不总是一秒(在一个循环结构里)
当然这个问题 我已经解决了~ 是因为timeout结构在第一次调用后 被修改了
沙漠里的海豚
2008-11-03
打赏
举报
回复
楼主应该明白select是一种阻塞式的信号轮询操作,timeout设定的是最大的阻塞等待时间,也就是说,在timeout规定的时间范围内没有信号产生的话,select就会返回,但是如果还没有到timeout设定的时间就有信号产生的话,select同样也会返回。
举个例子,如果timeout设置为10s,而5s时就发生了一个有网络数据包到来的信号,那么select在5s时就会返回,但如果10s内一直没有的话,那就等到10s返回。
再看sleep,sleep其实是占用了cpu的时间片来做一种纯粹的等待,一旦调用之后cpu是不会做任何事情的。就像上面的网络数据到来的情况,即便5s时有数据到来,因为是sleep(10),那么也会等到10s之后才会继续程序以后的处理。
不知这样说楼主明白了没?
jqx_ah
2008-11-02
打赏
举报
回复
select(0,NULL,NULL,NULL,&timeout2)//timeout2.tv_sec=1;timeout2.tv_usec=0;
就完全 一秒的效果~~? 为什么呢?
[/Quote]
打错了 : 应该是 不是一秒的效果~
jqx_ah
2008-11-02
打赏
举报
回复
[Quote=引用 3 楼 xhs_lh04 的回复:]
sleep和select都会阻塞线程一段时间,sleep是以秒为单位的, select是以微秒为单位的
sleep()是用SIGALRM实现的。他的定时并不可靠。而select()能精确返回时间。
[/Quote]
select(0,NULL,NULL,NULL,&timeout2)//
timeout2.tv_sec=1;timeout2.tv_usec=0;
就完全 一秒的效果~~? 为什么呢?
xhs_lh04
2008-11-02
打赏
举报
回复
seletc(1,NULL,NULL,NULL,timeout)作为LINUX下精确定时器的用法
jqx_ah
2008-11-02
打赏
举报
回复
[Quote=引用楼主 jqx_ah 的帖子:]
一直 以为 select(0,NULL,NULL,NULL,&timeout2)//timeout2.tv_sec=1;timeout2.tv_usec=0;
于sleep(1)相同~
今天编程 遇到一系列怪事~!
谁来接分 顺便给我个总结性的解释~ 谢谢
[/Quote]
我是在 利用信号量来控制共享内存的读写的时候 遇到问题的
目前 我最关心的就是 把select()当做进程挂起或阻塞时 与 sleep()的却别
另外 还有一点 郁闷的 就是 sleep(1) 与sleep(0.5)来控制输出字符
结果 在屏幕上输出时时效 明显 差距很大 不像 2倍的关系
帅得不敢出门
2008-11-02
打赏
举报
回复
select还另有用处
参数改变可以对线程进行轮询
arong1234
2008-11-02
打赏
举报
回复
select也不可靠的:)多任务系统的定时都是不准的,要看OS给你分配时间片没有
[Quote=引用 3 楼 xhs_lh04 的回复:]
sleep和select都会阻塞线程一段时间,sleep是以秒为单位的, select是以微秒为单位的
sleep()是用SIGALRM实现的。他的定时并不可靠。而select()能精确返回时间。
[/Quote]
xhs_lh04
2008-11-02
打赏
举报
回复
sleep和select都会阻塞线程一段时间,sleep是以秒为单位的, select是以微秒为单位的
sleep()是用SIGALRM实现的。他的定时并不可靠。而select()能精确返回时间。
arong1234
2008-11-02
打赏
举报
回复
例如:socket底层出现问题,可能会结束所有socket api的调用
arong1234
2008-11-02
打赏
举报
回复
估计你还不如把你遇到的怪事说出来
很显然,select在遇到异常、socket要等待的状态到达都可能提前返回,因此和sleep(1)等同很显然是不合理的
使用
select
实现
sleep
函数的功能
一、
sleep
和
select
到底哪个好 近期在阅读公司源码过程中发现了用
select
实现的
sleep
函数,经过思索和查阅相关资料,有了一定的了解, 1、首先两者都可以实现延时的效果,但是
sleep
延时的时间精确度上不高,因为设计CPU的调度算法、线程进程优先级,如果说对于时间上没有精确的要求,感觉
sleep
要笔记方便,就一行代码省事,无伤大雅。 2、也有人说
sleep
浪费CPU,使程序阻塞,如果说计算机资源本身就很紧缺,考虑系统的运行的效率、甚至网络传输速度,最好采用
select
。可以查看这个人的博客,相对
程序中用
sleep
和
select
阻塞休眠的区别
在看公司项目中发现超时控制中使用
select
替代
sleep
就行阻塞,循环检查任务是否超时,在网上找了很多资料说了
select
的各种好处: 1:
sleep
不准确,只能精确到秒(这个我感觉可以使用u
sleep
代替,不是个很好理由)。 2:
sleep
容易受到系统信号,例如SIGALRM影响,各个系统版本实现不一,
sleep
是个glic库函数,不是内核调用。 3:更高级的说话是,
sleep
浪费CPU
【备忘】mysql
select
sleep
(1)
指令:
select
sleep
(N) 说明: 让sql语句运行N秒钟 测试结果: 经过实际测试得出,单独执行
select
sleep
(1),那么执行耗时会被控制在1-2秒之内。如果结合实际数据测试则不是这个意思,变成了每一条数据查询耗时1秒多,例如我数据有10条,那么查询出来就是10秒,而不是这里参数N的耗时秒数。 图1: 图2: END ...
【博客201】
select
可代替
sleep
提供更高精度的定时
内容: 记录一下
select
的一些其他的用法 IO复用的方法可以有:
select
,poll,epoll 而其中的
select
除了做IO复用之外,还可以有其它有趣的用法: 1、做为定时器使用 2、检测fd是否有效(将fd注册可写,若
select
返回可写结果集中没有此fd,则该与fd对应的连接有问题)
select
作为定时器使用可以提供比
sleep
更高的精度: //秒级别定时器 void my_s...
linux 用
select
替代
sleep
(微秒级)
#include <sys/
select
.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> void local_
sleep
(long sec, long usec) { struct timeval ...
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章