日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux—select具体解释

發(fā)布時(shí)間:2025/4/16 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux—select具体解释 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

linux—select具體解釋

?

select系統(tǒng)調(diào)用時(shí)用來讓我們的程序監(jiān)視多個(gè)文件句柄的狀態(tài)變化的。程序會(huì)停在select這里等待,直到被監(jiān)視的文件句柄有一個(gè)或多個(gè)發(fā)生了狀態(tài)改變。

關(guān)于文件句柄,事實(shí)上就是一個(gè)整數(shù),通過socket函數(shù)的聲明就明確了:

int socket(int domain, int type, int protocol);

我們最熟悉的句柄是012三個(gè),0是標(biāo)準(zhǔn)輸入,1是標(biāo)準(zhǔn)輸出,2是標(biāo)準(zhǔn)錯(cuò)誤輸出。012是整數(shù)表示的,相應(yīng)的FILE *結(jié)構(gòu)的表示就是stdinstdoutstderr

繼續(xù)上面的select,就是用來監(jiān)視某個(gè)或某些句柄的狀態(tài)變化的。select函數(shù)原型例如以下:

int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

函數(shù)的最后一個(gè)參數(shù)timeout是一個(gè)超時(shí)時(shí)間值。其類型是struct timeval *,即一個(gè)struct timeval結(jié)構(gòu)的變量的指針,所以我們?cè)诔绦蚶镆暶饕粋€(gè)struct timeval tv;然后把變量tv的地址&tv傳遞給select函數(shù)。struct timeval結(jié)構(gòu)例如以下:

struct timeval

{

?????? long tv_sec;? //seconds

?????? long tv_usec; //microseconds

}

234三個(gè)參數(shù)是一樣的類型;fd_set *,即我們?cè)诔绦蚶镆暾?qǐng)幾個(gè)fd_set類型的變量,比方rdfdswtfdsexfds,然后把這個(gè)變量的地址&rdfds,&wtfds,&exfds傳遞給select函數(shù)。這三個(gè)參數(shù)都是一個(gè)句柄的集合,第一個(gè)rdfds是用來保存這種句柄的:當(dāng)句柄的狀態(tài)變成可讀時(shí)系統(tǒng)就告訴select函數(shù)返回,同理第二個(gè)函數(shù)是指向有句柄狀態(tài)變成可寫時(shí)系統(tǒng)就會(huì)告訴select函數(shù)返回,同理第三個(gè)參數(shù)exfds是特殊情況,即句柄上有特殊情況發(fā)生時(shí)系統(tǒng)會(huì)告訴select函數(shù)返回。特殊情況比方對(duì)方通過一個(gè)socket句柄發(fā)來了緊急數(shù)據(jù)。假設(shè)我們程序里僅僅想檢測(cè)某個(gè)socket是否有數(shù)據(jù)可讀,我們能夠這樣:

fd_set? rdfds;

struct timeval tv;

int ret;

FD_ZERO(&rdfds);

FD_SET(socket, &rdfds);

tv.tv_sec = 1;

tv.tv_uses = 500;

ret = select (socket + 1, %rdfds, NULL, NULL, &tv);

if(ret < 0) perror (“select”);

else if (ret = = 0) printf(“time out”);

else {

?????? printf(“ret = %d/n”,ret);

?????? if(FD_ISSET(socket, &rdfds)){

??? /* 讀取socket句柄里的數(shù)據(jù) */

recv( );

}

}

注意select函數(shù)的第一個(gè)參數(shù),是全部增加集合的句柄值的最大那個(gè)那個(gè)值還要加1.比方我們創(chuàng)建了3個(gè)句柄;

int sa, sb, sc;

sa = socket(……);

connect (sa,….);

?

sb = socket(….);

connect (sb,…);

?

sc = socket(….);

connect(sc,…);

?

FD_SET(sa, &rdfds);

FD_SET(sb, &rdfds);

FD_SET(sc, &rdfds);

?

在使用select函數(shù)之前,一定要找到3個(gè)句柄中的最大值是哪個(gè),我們一般定義一個(gè)變量來保存最大值,取得最大socket值例如以下:

int maxfd = 0;

if(sa > maxfd) maxfd = sa;

if(sb > maxfd) maxfd = sb;

if(sc > maxfd) maxfd = sc;

?

然后調(diào)用select函數(shù):

ret = select (maxfd+1, &rdfds, NULL, NULL,&tv);

?

相同的道理,假設(shè)我們是檢測(cè)用戶是否按了鍵盤進(jìn)行輸入,我們就應(yīng)該把標(biāo)準(zhǔn)輸入0這個(gè)句柄放到select里來檢測(cè),例如以下:

FD_ZERO(&rdfds);

FD_SET(0, &rdfds);

tv.tv_sec = 1;

tv.tv_usec = 0;

ret = select (1, &rdfds,NULL,NULL,&tv);

if(ret < 0) perror(“select”);

else if (ret = = 0) printf (“time out/n”);

else{

?????? scanf(“%s”,buf);

}

?

轉(zhuǎn)載于:https://www.cnblogs.com/zfyouxi/p/4288259.html

總結(jié)

以上是生活随笔為你收集整理的linux—select具体解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。