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 打赏 收藏 转发到动态 举报
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)等同很显然是不合理的

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧