作者godman362 (青)
看板NUU_CSIE
标题[心得] Async I/O (2)
时间Tue Aug 4 08:20:09 2009
拖了很久,一直蛮忙的
补习、弄专题什麽的,等等还要去开会,趁现在有空打一打
由於poll的效能不是很好,所以我就不做介绍
等等有时间的话再谈为什麽效能不好,他要牵扯到一些OS的观念
所以接下来我要讲的是select的用法:
select(int maxfd, fd_set *Read, fd_set *Write, fd_set *Except, timeval *timeout)
以上是select的函数参数
首先,会看到完全不认识的两个资料型态:fd_set, timeval
fd_set是一个放fd的地方,也就是说他是一个fd的
集合
将你要处理的fd丢入这个集合之中,传给select当参数
再由select去帮你看这个fd_set中的fd是否已经准备好可以传、写资料
对fd的操作,有以下几种方式:
FD_ZERO:对宣告出来的fd_set
做初始化,一定要做
FD_SET:将fd丢进自己宣告的fd_set中
FD_CLR:将fd从指定的fd_set移除
FD_ISSET:判断此fd是否在该fd_set中准备好传、写资料
底下来个使用范例:
FD_ZERO(&Readset);
FD_SET(0, &Writeset);
FD_CLR(1, &Readset);
if (FD_ISSET(0, &Writeset)) { ... }
接着,来说明timeval的意义
在最後一个参数,是用来放timeout时间
简单说,就是要让select对此有准备好的fd等待多久时间
若该fd准备好,但是不动作的话,最多只会等待timeout的时间
时间到後,则不予理会,往下一个准备好的fd动作
该fd则须等待到下一轮才可再动作,以下来个例子:
timeval timeout;
timeout.tv_sec = 0;
//秒
timeout.tv_usec = 10000;
//微秒
再来谈select的return value
return value正常来说会有三种:
< 0:发生signal interrupt该process
= 0:发生timeout
> 0:有 > 0个fd已经准备好可以动作(包涵读写)
同样,来一个使用范例:
ret = select(FD_SETSIZE, &read, &write, &except, &timeout);
因为select只检查一次
所以如果是用来写网路的话,要用infinite loop去包起来
其中,fd_set的资料在一次select之後,会全部清光
必须重新自己再assign
所以必须在select之前,再重新给予fd_set的fd
以上,补完
下次见。
(开会ing.....)
--
要
感谢的人太多了,那就
谢天吧
要
改得程式码太多了,那就
改天吧
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.118.4.78