青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評(píng)論-24  文章-0  trackbacks-0
select()函數(shù)和poll()函數(shù)均是主要用來處理多路I/O復(fù)用的情況。比如一個(gè)服務(wù)器既想等待輸入終端到來,又想等待若干個(gè)套接字有客戶請(qǐng)求到達(dá),這時(shí)候就需要借助select或者poll函數(shù)了。

(一)select()函數(shù)

原型如下:

1 int select(int fdsp1, fd_set *readfds, fd_set *writefds, fd_set *errorfds, const struct timeval *timeout);

各個(gè)參數(shù)含義如下:
  • int fdsp1:最大描述符值 + 1
  • fd_set *readfds:對(duì)可讀感興趣的描述符集
  • fd_set *writefds:對(duì)可寫感興趣的描述符集
  • fd_set *errorfds:對(duì)出錯(cuò)感興趣的描述符集
  • struct timeval *timeout:超時(shí)時(shí)間(注意:對(duì)于linux系統(tǒng),此參數(shù)沒有const限制,每次select調(diào)用完畢timeout的值都被修改為剩余時(shí)間,而unix系統(tǒng)則不會(huì)改變timeout值)
select函數(shù)會(huì)在發(fā)生以下情況時(shí)返回:
  1. readfds集合中有描述符可讀
  2. writefds集合中有描述符可寫
  3. errorfds集合中有描述符遇到錯(cuò)誤條件
  4. 指定的超時(shí)時(shí)間timeout到了
當(dāng)select返回時(shí),描述符集合將被修改以指示哪些個(gè)描述符正處于可讀、可寫或有錯(cuò)誤狀態(tài)。可以用FD_ISSET宏對(duì)描述符進(jìn)行測(cè)試以找到狀態(tài)變化的描述符。如果select因?yàn)槌瑫r(shí)而返回的話,所有的描述符集合都將被清空。
select函數(shù)返回狀態(tài)發(fā)生變化的描述符總數(shù)。返回0意味著超時(shí)。失敗則返回-1并設(shè)置errno。可能出現(xiàn)的錯(cuò)誤有:EBADF(無效描述符)、EINTR(因終端而返回)、EINVAL(nfds或timeout取值錯(cuò)誤)。
設(shè)置描述符集合通常用如下幾個(gè)宏定義:

1 FD_ZERO(fd_set *fdset);                /* clear all bits in fdset           */
2 FD_SET(int fd, fd_set *fdset);         /* turn on the bit for fd in fd_set  */
3 FD_CLR(int fd, fd_set *fdset);         /* turn off the bit for fd in fd_set */
4 int FD_ISSET(int fd, fd_set *fdset);   /* is the bit for fd on in fdset?    */

如:

1 fd_set rset;
2 FD_ZERO(&rset);                        /* initialize the set: all bits off  */
3 FD_SET(1&rset);                      /* turn on bit for fd 1              */
4 FD_SET(4&rset);                      /* turn on bit for fd 4              */
5 FD_SET(5&rset);                      /* turn on bit for fd 5              */

當(dāng)select返回的時(shí)候,rset位都將被置0,除了那些有變化的fd位。
當(dāng)發(fā)生如下情況時(shí)認(rèn)為是可讀的:
  1. socket的receive buffer中的字節(jié)數(shù)大于socket的receive buffer的low-water mark屬性值。(low-water mark值類似于分水嶺,當(dāng)receive buffer中的字節(jié)數(shù)小于low-water mark值的時(shí)候,認(rèn)為socket還不可讀,只有當(dāng)receive buffer中的字節(jié)數(shù)達(dá)到一定量的時(shí)候才認(rèn)為socket可讀)
  2. 連接半關(guān)閉(讀關(guān)閉,即收到對(duì)端發(fā)來的FIN包)
  3. 發(fā)生變化的描述符是被動(dòng)套接字,而連接的三路握手完成的數(shù)量大于0,即有新的TCP連接建立
  4. 描述符發(fā)生錯(cuò)誤,如果調(diào)用read系統(tǒng)調(diào)用讀套接字的話會(huì)返回-1。
當(dāng)發(fā)生如下情況時(shí)認(rèn)為是可寫的:
  1. socket的send buffer中的字節(jié)數(shù)大于socket的send buffer的low-water mark屬性值以及socket已經(jīng)連接或者不需要連接(如UDP)。
  2. 寫半連接關(guān)閉,調(diào)用write函數(shù)將產(chǎn)生SIGPIPE
  3. 描述符發(fā)生錯(cuò)誤,如果調(diào)用write系統(tǒng)調(diào)用寫套接字的話會(huì)返回-1。
注意:
select默認(rèn)能處理的描述符數(shù)量是有上限的,為FD_SETSIZE的大小。
對(duì)于timeout參數(shù),如果置為NULL,則表示wait forever;若timeout->tv_sec = timeout->tv_usec = 0,則表示do not wait at all;否則指定等待時(shí)間。
如果使用select處理多個(gè)套接字,那么需要使用一個(gè)數(shù)組(也可以是其他結(jié)構(gòu))來記錄各個(gè)描述符的狀態(tài)。而使用poll則不需要,下面看poll函數(shù)。

(二)poll()函數(shù)

原型如下:

1 int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

各參數(shù)含義如下:
  • struct pollfd *fdarray:一個(gè)結(jié)構(gòu)體,用來保存各個(gè)描述符的相關(guān)狀態(tài)。
  • unsigned long nfds:fdarray數(shù)組的大小,即里面包含有效成員的數(shù)量。
  • int timeout:設(shè)定的超時(shí)時(shí)間。(以毫秒為單位)
poll函數(shù)返回值及含義如下:
  • -1:有錯(cuò)誤產(chǎn)生
  • 0:超時(shí)時(shí)間到,而且沒有描述符有狀態(tài)變化
  • >0:有狀態(tài)變化的描述符個(gè)數(shù)
著重講fdarray數(shù)組,因?yàn)檫@是它和select()函數(shù)主要的不同的地方:
pollfd的結(jié)構(gòu)如下:

1 struct pollfd {
2    int fd;                  /* descriptor to check */
3    short events;      /* events of interest on fd */
4    short revents;     /* events that occured on fd */
5 };

其實(shí)poll()和select()函數(shù)要處理的問題是相同的,只不過是不同組織在幾乎相同時(shí)刻同時(shí)推出的,因此才同時(shí)保留了下來。select()函數(shù)把可讀描述符、可寫描述符、錯(cuò)誤描述符分在了三個(gè)集合里,這三個(gè)集合都是用bit位來標(biāo)記一個(gè)描述符,一旦有若干個(gè)描述符狀態(tài)發(fā)生變化,那么它將被置位,而其他沒有發(fā)生變化的描述符的bit位將被clear,也就是說select()的readset、writeset、errorset是一個(gè)value-result類型,通過它們傳值,而也通過它們返回結(jié)果。這樣的一個(gè)壞處是每次重新select 的時(shí)候?qū)媳仨氈匦沦x值。而poll()函數(shù)則與select()采用的方式不同,它通過一個(gè)結(jié)構(gòu)數(shù)組保存各個(gè)描述符的狀態(tài),每個(gè)結(jié)構(gòu)體第一項(xiàng)fd代表描述符,第二項(xiàng)代表要監(jiān)聽的事件,也就是感興趣的事件,而第三項(xiàng)代表poll()返回時(shí)描述符的返回狀態(tài)。合法狀態(tài)如下:

  • POLLIN:                有普通數(shù)據(jù)或者優(yōu)先數(shù)據(jù)可讀
  • POLLRDNORM:    有普通數(shù)據(jù)可讀
  • POLLRDBAND:    有優(yōu)先數(shù)據(jù)可讀
  • POLLPRI:              有緊急數(shù)據(jù)可讀
  • POLLOUT:            有普通數(shù)據(jù)可寫
  • POLLWRNORM:   有普通數(shù)據(jù)可寫
  • POLLWRBAND:    有緊急數(shù)據(jù)可寫
  • POLLERR:            有錯(cuò)誤發(fā)生
  • POLLHUP:            有描述符掛起事件發(fā)生
  • POLLNVAL:          描述符非法

對(duì)于POLLIN | POLLPRI等價(jià)與select()的可讀事件;POLLOUT | POLLWRBAND等價(jià)與select()的可寫事件;POLLIN 等價(jià)與POLLRDNORM | POLLRDBAND,而POLLOUT等價(jià)于POLLWRBAND。如果你對(duì)一個(gè)描述符的可讀事件和可寫事件以及錯(cuò)誤等事件均感興趣那么你應(yīng)該都進(jìn)行相應(yīng)的設(shè)置。
對(duì)于timeout的設(shè)置如下:
  • INFTIM:   wait forever
  • 0:            return immediately, do not block
  • >0:         wait specified number of milliseconds

對(duì)于select()和poll()函數(shù)的講解暫時(shí)到此。 更多細(xì)節(jié)請(qǐng)參考下面這篇博文:http://m.shnenglu.com/just51living/archive/2011/07/28/151995.html
posted on 2011-10-26 19:04 myjfm 閱讀(12039) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩西西人体444www| 老司机亚洲精品| 麻豆成人在线播放| 久久久久久久综合狠狠综合| 午夜精品久久久久久久久| 亚洲综合色丁香婷婷六月图片| 亚洲伊人色欲综合网| 午夜精品在线| 蜜乳av另类精品一区二区| 欧美成人午夜激情| 亚洲精品在线观看视频| 亚洲性夜色噜噜噜7777| 欧美中文字幕视频| 免费成人av资源网| 国产精品久线观看视频| 激情综合网址| 一区二区欧美在线观看| 久久久欧美精品sm网站| 亚洲人午夜精品免费| 中日韩美女免费视频网站在线观看| 亚洲一区二区三区精品在线| 玖玖综合伊人| 国产精品一区久久久| 亚洲黄页一区| 欧美中文字幕在线播放| 最新日韩在线| 欧美中文字幕| 国产精品国产三级国产专播品爱网| 韩日视频一区| 亚洲欧美日韩人成在线播放| 欧美风情在线观看| 先锋影音国产精品| 欧美日本精品| 亚洲国产视频a| 久久精品女人| 亚洲性视频h| 欧美女同视频| 亚洲国产婷婷综合在线精品| 久久精品国产免费看久久精品| 亚洲精品在线视频观看| 另类天堂视频在线观看| 国产一区三区三区| 欧美在线三区| 中国成人黄色视屏| 欧美日韩免费在线视频| 亚洲人体1000| 欧美激情1区| 久久―日本道色综合久久| 国产日韩亚洲欧美精品| 欧美一区二区三区啪啪| 亚洲视频综合| 国产精品你懂的| 亚洲欧美国产精品桃花| 亚洲婷婷免费| 国产精品免费一区豆花| 亚洲在线成人精品| 一区二区三区视频观看| 亚洲大片免费看| 欧美成年人网站| 久久久久久久97| 国内精品伊人久久久久av一坑| 欧美一区2区三区4区公司二百| av成人免费| 国产精品乱码一区二区三区| 亚洲一区二区在线播放| 中国亚洲黄色| 国产亚洲欧美另类中文| 久久麻豆一区二区| 欧美在线一区二区三区| 国内精品久久久久久 | 国产一区二区三区高清播放| 国产精品99久久久久久久vr| 亚洲激情综合| 欧美日韩一区二区三区四区五区 | 国模套图日韩精品一区二区| 久久成人精品无人区| 小黄鸭精品aⅴ导航网站入口| 国产农村妇女精品| 久久男人资源视频| 美女亚洲精品| 亚洲视频1区2区| 亚洲综合欧美日韩| 精品不卡一区二区三区| 欧美福利专区| 国产精品不卡在线| 久久日韩粉嫩一区二区三区| 久久中文字幕一区| 亚洲视频一区在线| 久久黄金**| 中文精品在线| 久久久伊人欧美| 99国产精品私拍| 欧美一级专区| 一区二区三区精品久久久| 香蕉久久夜色精品国产| 亚洲美女精品成人在线视频| 亚洲欧美国产77777| 亚洲大片精品永久免费| 在线亚洲欧美专区二区| 伊人精品成人久久综合软件| 99精品国产热久久91蜜凸| 韩日欧美一区二区| 一二三区精品| 亚洲激情偷拍| 欧美一区二区三区婷婷月色 | 国产香蕉久久精品综合网| 欧美国产综合视频| 国产日韩欧美中文| 一本色道久久综合亚洲精品不| 伊人激情综合| 先锋影音一区二区三区| 亚洲综合久久久久| 欧美福利专区| 99国产一区| 欧美顶级大胆免费视频| 国产欧美精品日韩区二区麻豆天美| 欧美激情按摩在线| 国精产品99永久一区一区| 一区二区三区国产在线| a4yy欧美一区二区三区| 免费不卡亚洲欧美| 免费成人美女女| 国模叶桐国产精品一区| 欧美亚洲免费在线| 欧美一区二区三区视频在线| 欧美色另类天堂2015| 亚洲精品久久久久久久久久久久| 亚洲福利视频一区| 久久精品女人的天堂av| 久久精品系列| 国产一区二区在线观看免费播放| 亚洲午夜精品网| 亚洲免费视频在线观看| 国产精品r级在线| 亚洲视频欧美视频| 亚洲欧美日韩天堂一区二区| 欧美日韩在线高清| 在线视频你懂得一区| 亚洲综合色自拍一区| 国产精品v一区二区三区| 夜夜嗨av一区二区三区| 午夜精品区一区二区三| 国产乱码精品一区二区三区忘忧草| 亚洲香蕉视频| 久久精品国产免费| 在线高清一区| 欧美大片一区二区三区| 亚洲欧洲免费视频| 亚洲尤物在线视频观看| 国产精品自拍视频| 久久精品av麻豆的观看方式| 免费黄网站欧美| 日韩一级免费观看| 国产精品成人观看视频国产奇米| 一本色道久久加勒比精品| 欧美综合国产| 亚洲国产一区二区三区在线播| 欧美激情中文字幕乱码免费| 亚洲素人一区二区| 久久久久88色偷偷免费| 91久久综合| 国产精品日韩| 久久婷婷国产综合精品青草 | 亚洲视频欧洲视频| 久久国产精品久久久久久久久久| 好看的亚洲午夜视频在线| 欧美xxxx在线观看| 亚洲天堂免费观看| 免费不卡在线视频| 亚洲一区三区视频在线观看| 国语自产精品视频在线看抢先版结局| 另类专区欧美制服同性| 一本久久综合亚洲鲁鲁| 六月天综合网| 亚洲欧美日韩综合国产aⅴ| 国产中文一区二区三区| 欧美高清视频一区| 欧美在线二区| av成人手机在线| 久久夜色精品国产噜噜av| 亚洲最新色图| 在线成人av网站| 国产日产欧产精品推荐色 | 一本一本久久a久久精品综合麻豆| 亚洲一区日韩在线| 亚洲春色另类小说| 国产目拍亚洲精品99久久精品| 久久免费视频在线观看| 亚洲少妇在线| 亚洲国产综合在线| 久久精品在线播放| 亚洲欧美国产精品专区久久| 91久久精品国产91性色| 国产区亚洲区欧美区| 欧美日韩99| 欧美激情一区三区| 欧美成年人视频网站欧美| 久久精品九九| 欧美一区二区私人影院日本 | 欧美屁股在线|