Chinaunix

标题: 关于select调用 [打印本页]

作者: legone2008    时间: 2008-07-17 16:33
标题: 关于select调用
大家好,今天学习c语言select调用,有个问题求解。
环境:REHL AS 4
select()的调用形式为:
#include <sys/select.h>
#include <sys/time.h>
int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout);

很多资料对timeout的解释基本如下:
1.timeout为0,调用立即返回,或者说立即超时。
2.timeout为NULL,select()调用就阻塞,直到知道有文件描述符就绪;
3.timeout为正整数,就是一般的定时器。

问题在这里:我写了段代码测试,timeout设置成0时,也没有返回或者立即超时啊。他跟NULL一样,一直阻塞。而且,NULL的整型值不就是0吗?
不明白,哪位老师能否给解释一下timeout为0时是怎样一种情况,有部分代码说明最好。
谢谢!
作者: linternt    时间: 2008-07-17 17:11
0的时候就应该是无限阻塞吧!

如果楼主想即时返回,可以将描述符设定成非阻塞的!
作者: legone2008    时间: 2008-07-17 17:14
网上查了些资料,说0是立即超时,上面说的是立即返回,并不是无限阻塞,如果无限阻塞了那NULL用来干什么?
我不是想立即返回,我只是不明白,timeout设置成NULL和设置成0,有什么不同?

[ 本帖最后由 legone2008 于 2008-7-17 17:15 编辑 ]
作者: ly321    时间: 2008-07-17 17:18
是否立即返回应该取决于socket工作在是否阻塞的模式吧
作者: 绝不妥协    时间: 2008-07-17 19:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: gawk    时间: 2008-07-17 19:22
楼主,0指的是timeout指向的结构中的值为0
作者: happy_fish100    时间: 2008-07-17 21:38
struct timeval *timeout

struct timeval为结构体,有两个成员变量:
tv_sec:秒数
tv_usec:百万分之一秒

例如:
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;

select(..., &timeout);
表示超时时间为10秒
作者: bobozhang    时间: 2008-07-17 21:59
对,前面的说得对,.tv_sec = 0和.tv_usec = 0表示立即返回。
select是否阻塞,跟select监视的描述符是否阻塞没有任何关系。
作者: nicozhou    时间: 2008-07-17 22:21
有点像同步调用和异步调用
作者: chenzhanyiczy    时间: 2008-07-17 22:41
原帖由 bobozhang 于 2008-7-17 21:59 发表
对,前面的说得对,.tv_sec = 0和.tv_usec = 0表示立即返回。
select是否阻塞,跟select监视的描述符是否阻塞没有任何关系。

同意
作者: legone2008    时间: 2008-07-18 11:49
感谢楼上各位。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2