poll系統呼叫

2021-08-11 18:15:10 字數 1998 閱讀 2999

上節所述的io復用中的select函式基本機制與poll基本一致,都是採用輪詢的方式來檢視我們所關注的檔案描述符。

一:下面我們首先介紹一下poll與select的區別:

1. poll將描述符和事件統一到乙個結構體中

2. poll能夠同時監聽的檔案描述符比select多

3. poll事件型別比select多:包括優先順序帶資料可讀,高優先順序資料可讀等事件型別

二:poll系統呼叫

#include

int poll(struct pollfd* fds,nfds_t nfds,int tinmeout)

1. 引數意義

第乙個引數是乙個pollfd結構型別的陣列,它指定所有我們感興趣的檔案描述符上發生的可讀,可寫和異常事件等,pollfd結構體定義如下:「

struct pollfd

int fd;   //檔案描述符

short events; //註冊的事件,即關注的事件,如果有多個關注事件,可以按位或

short revents; //實際發生的事情,由核心來填充

第二個引數指定被監聽的事件集合fds的大小;第三個引數為poll的超時時間,單位為毫秒。

2. 返回值

返回值為0,表示超時,返回值為負數,表示出錯,大於0,表示就緒的檔案描述符數

3. 基本原理

poll函式與select函式原理基本相同,只是它不需要每次將位集合清0,因為其有乙個結構體陣列,每個結構體陣列都包含乙個檔案描述符和關注事件以及實際發生的事件,呼叫poll函式之後,核心會將當前正在監聽的該檔案描述符上的實際發生的事件儲存在revents中,我們只需要核對該檔案描述符上實際發生的事件是否是我們想要關注的事件,如果是,則判斷是否是當前我們關心的監聽檔案描述符,如果是,執行相應的業務操作進行客戶端連線,完成三次握手,否則,就有可能是客戶端已經連線的檔案描述符上的資料已經準備就緒,這時我們只需要呼叫recv函式進行讀取資料就可以了。

4. 遇到每次只接收乙個字元的情況,處理方式

當每次只接收讀取乙個字元時,而客戶端還是每次輸入乙個字串時,那麼伺服器端就會呼叫poll一共字串的長度加1次(包含回車),最終伺服器端的終端上會主次將輸入的字串以一次乙個字元的形式列印顯示出來,再輸出乙個回車字元。原因在於核心會一直提醒我們該檔案描述符上有資料準備就緒,一直等到我們將所有資料處理完成後才停止。

5. 伺服器端**如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max 30

int create_socket();

void fds_init(struct pollfd fds)

}void fds_add(struct pollfd fds,int fd)

}}void fds_clr(struct pollfd fds,int fd)

}}int main()

else if(n==0)

else

if(fds[i].revents & pollin)

printf("accept ::c=%d\n",c);

fds_add(fds,c);

}else

;if(recv(fds[i].fd,buff,127,0)<=0)//why we can not read many times?because once no data,the recv will block,can not over

printf("read(%d)=%s\n",fds[i].fd,buff);

send(fds[i].fd,"ok",2,0);}}

}                                     }

}}int create_socket()

poll系統呼叫

1 include 2 int poll struct pollfd fds,nfds t nfds,int timeout fds,pollfd結構型別的陣列 可變長陣列,陣列元素為結構體pollfd 結構體中含有三個成員變數 int,short,short 分別為檔案描述符fd,註冊的事件eve...

poll 系統呼叫 2

過段時間再看poll系統呼叫,還是不知說的啥。還是要概括下,寫成流水帳沒什麼用。系統呼叫 poll的功能說白了就是當前程序睡眠在fd的事件上,當事件發生後,退出睡眠,並返回發生的事件。syscall define3 poll,struct pollfd user ufds,unsigned int,...

IO復用 poll系統呼叫

poll系統呼叫和select類似,也是在指定時間內輪詢一定數量的檔案描述符,以測試其中是否有已就緒的檔案描述符,pool原型如下 includeint poll struct pollfd fds,nfds t nfds,int timeout 1.fds引數是乙個pollfd結構型別的陣列,它指...