findfirstfile函数为什么不能遍历doc_编程之美:IO多路复用——记性不好的poll函数...
各位看官大家好,在上一篇文章中,我們詳細(xì)講解了select函數(shù),也在文末上傳了實(shí)現(xiàn)代碼。今天我們來了解一下poll函數(shù),他和select又有哪些不同,哪些相似。
很尷尬我找不到合適的配圖
Poll函數(shù)詳解
在上一篇文章中我們提到select有如下幾個(gè)缺點(diǎn):
要知道這些問題是select設(shè)計(jì)伊始就已經(jīng)存在的,只要使用就勢必存在上述的缺點(diǎn)。
poll函數(shù)相比select函數(shù)有個(gè)質(zhì)的飛躍——對文件描述符的個(gè)數(shù)不在限制,雖然沒有解決開銷大的問題,不過十全十美的東西確實(shí)也不存在對吧,這個(gè)道理放在程序開發(fā)上也是如此。
poll函數(shù)和select函數(shù)沒有本質(zhì)上的區(qū)別。poll將用戶傳入的數(shù)組拷貝到內(nèi)核,通過查詢每個(gè)fd對應(yīng)的設(shè)備狀態(tài),如果設(shè)備就緒則在設(shè)備等待隊(duì)列中加入一項(xiàng)并繼續(xù)遍歷,如果遍歷完所有fd后沒有發(fā)現(xiàn)就緒設(shè)備,就把當(dāng)前進(jìn)程掛起,直到設(shè)備就緒或者超時(shí),被喚醒后重新對fd進(jìn)行新的遍歷。
至于poll為什么沒有了對文件描述符個(gè)數(shù)的限制,是因?yàn)?strong>在該函數(shù)使用鏈表作為存儲結(jié)構(gòu),鏈表的特性就是可以充分使用系統(tǒng)空間,非常靈活。對鏈表感興趣的朋友可以百度相關(guān)內(nèi)容,資源非常多,這里不再累述。
前面剛說了沒有絕對完美的東西,poll也存在著幾個(gè)比較影響人心情的問題:
- 由于一直進(jìn)行遍歷,必定會(huì)出現(xiàn)無用重復(fù)的循環(huán),且無法避免;
- fd的數(shù)組整體復(fù)制在用戶態(tài)和內(nèi)核地址空間中,但這些fd不一定會(huì)用到,也就是說這些復(fù)制操作不一定有意義。
- 如果對收到的fd信息沒有處理,那么下次執(zhí)行的時(shí)會(huì)再次報(bào)告該fd,執(zhí)行多少次就報(bào)告多少次(看起來poll函數(shù)確實(shí)記性不好。)
另外,在客戶端眾多的情況下,無論是select還是poll函數(shù)在執(zhí)行一段時(shí)間后效率都是直線下降的,因?yàn)閷?shí)際中處于就緒狀態(tài)的客戶端畢竟是少數(shù)。
下面我們來具體學(xué)習(xí)一下poll函數(shù)的原型及參數(shù)含義:
int poll(struct pollfd fd[], nfds_t nfds, int timeout);
struct pollfd fd【】: 一個(gè)結(jié)構(gòu)數(shù)組,struct pollfd結(jié)構(gòu)如下:
struct pollfd{
int fd; //文件描述符
short events; //請求事件
short revents; //返回事件
};
nfds_t nfds:監(jiān)聽描述符的個(gè)數(shù)
int timeout:阻塞時(shí)間單位:ms
這里要注意一下poll函數(shù)的返回值,有以下三種情況:
下面是具體的實(shí)現(xiàn)代碼:
#include
#include
#include
#include
#include
#include
#include
#include
int main()
{
int fd = open("/dev/input/mouse1
總結(jié)
以上是生活随笔為你收集整理的findfirstfile函数为什么不能遍历doc_编程之美:IO多路复用——记性不好的poll函数...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 安装只有一半_记一次MySQ
- 下一篇: mysql运行报错64bit_关于MyS