linux—select具体解释
?
linux—select具體解釋
?
select系統(tǒng)調(diào)用時用來讓我們的程序監(jiān)視多個文件句柄的狀態(tài)變化的。程序會停在select這里等待,直到被監(jiān)視的文件句柄有一個或多個發(fā)生了狀態(tài)改變。
關于文件句柄,事實上就是一個整數(shù),通過socket函數(shù)的聲明就明確了:
int socket(int domain, int type, int protocol);
我們最熟悉的句柄是0、1、2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0、1、2是整數(shù)表示的,相應的FILE *結構的表示就是stdin、stdout、stderr。
繼續(xù)上面的select,就是用來監(jiān)視某個或某些句柄的狀態(tài)變化的。select函數(shù)原型例如以下:
int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
函數(shù)的最后一個參數(shù)timeout是一個超時時間值。其類型是struct timeval *,即一個struct timeval結構的變量的指針,所以我們在程序里要聲明一個struct timeval tv;然后把變量tv的地址&tv傳遞給select函數(shù)。struct timeval結構例如以下:
struct timeval
{
?????? long tv_sec;? //seconds
?????? long tv_usec; //microseconds
};
第2、3、4三個參數(shù)是一樣的類型;fd_set *,即我們在程序里要申請幾個fd_set類型的變量,比方rdfds,wtfds,exfds,然后把這個變量的地址&rdfds,&wtfds,&exfds傳遞給select函數(shù)。這三個參數(shù)都是一個句柄的集合,第一個rdfds是用來保存這種句柄的:當句柄的狀態(tài)變成可讀時系統(tǒng)就告訴select函數(shù)返回,同理第二個函數(shù)是指向有句柄狀態(tài)變成可寫時系統(tǒng)就會告訴select函數(shù)返回,同理第三個參數(shù)exfds是特殊情況,即句柄上有特殊情況發(fā)生時系統(tǒng)會告訴select函數(shù)返回。特殊情況比方對方通過一個socket句柄發(fā)來了緊急數(shù)據(jù)。假設我們程序里僅僅想檢測某個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ù)的第一個參數(shù),是全部增加集合的句柄值的最大那個那個值還要加1.比方我們創(chuàng)建了3個句柄;
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個句柄中的最大值是哪個,我們一般定義一個變量來保存最大值,取得最大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);
?
相同的道理,假設我們是檢測用戶是否按了鍵盤進行輸入,我們就應該把標準輸入0這個句柄放到select里來檢測,例如以下:
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
總結
以上是生活随笔為你收集整理的linux—select具体解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 设置thumb图片大小
- 下一篇: Linux Tomcat 简介