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