社区
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)相同~
今天编程 遇到一系列怪事~!
谁来接分 顺便给我个总结性的解释~ 谢谢
...全文
592
11
打赏
收藏
select于sleep
一直 以为 select(0,NULL,NULL,NULL,&timeout2)//timeout2.tv_sec=1;timeout2.tv_usec=0; 于sleep(1)相同~ 今天编程 遇到一系列怪事~! 谁来接分 顺便给我个总结性的解释~ 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)等同很显然是不合理的
linux下的
sleep
u
sleep
select
本文介绍了Linux中用于延迟的
sleep
和u
sleep
函数,以及用于多路复用I/O的
select
函数。
sleep
函数使进程休眠n秒,而u
sleep
函数休眠n微秒。
select
函数用于等待多个文件描述符的就绪状态,通过struct timeval结构设置超时时间。文中提供了一个简单的
select
函数示例,用于检测socket句柄的可读性,并展示了如何处理多个句柄和设置最大值的技巧。
程序中用
sleep
和
select
阻塞休眠的区别
文章探讨了在程序中使用
sleep
和
select
进行阻塞休眠的区别,指出
sleep
可能存在精度不准确、易受SIGALRM信号影响等问题,而
select
提供更可靠的等待方式。建议在需要精确等待时间的情况下使用
select
,并提供了关于如何避免
sleep
不准确性的建议。
sleep
与
select
函数
本文解答了关于多线程环境下如何实现线程延时的问题,包括
sleep
函数的使用及
select
函数作为延时手段的机制解析。文章还讨论了不同延时方法的特点及其在多线程间的相互作用。
使用
select
函数实现
sleep
的功能
博客展示了一段代码,通过定义timeval结构体变量tv并设置其秒和微秒值,使用
select
函数实现了类似
sleep
(3)的功能,体现了一种利用
select
函数进行时间控制的编程方法。
使用
select
实现
sleep
函数的功能
本文探讨了
sleep
与
select
在实现延时功能上的区别。
sleep
使用简便但精确度受限于调度算法及优先级;
select
虽复杂些,但能提供更好的时间精度且不阻塞程序,适合资源紧张或对网络传输速度敏感的场景。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章