poll 函式學習筆記 適合小白理解

2021-08-28 06:22:55 字數 1906 閱讀 9803

在工作中遇到了poll()函式,決定來了解一下,參考《unix環境高階程式設計》。

我的理解是:poll()函式有乙個監聽池,我們把要監聽的檔案描述符以及我們對該描述符感興趣的條件(讀,寫等等)放進池子裡,然後就等poll()幫我們監聽,等poll()正常返回時,就是有描述符發生了變化,我們通過遍歷找到這個變化的檔案描述符,再去進行相應的操作(讀,寫等等)即可。

#include int poll(struct pollfd fdarray, nfds_t nfds, int timeout);
準備就緒的描述符數目;若超時,返回0;若出錯,返回-1。

pollfd結構如下,

struct pollfd;
fd是監聽的檔案描述符,

events設定的值,是我們關心的每個檔案描述符會發生的哪些事件

revents的值用作返回時,說明每個檔案描述符發生了哪些事件,也就是實際發生的事件

nfds用來指定fdarray陣列中的元素數目。經過測試,如果監聽了兩個fd,但是nfds==1的情況下,只有fdarray[0].fd能被監聽到

timeout指定的是我們願意等待多長時間。timeout==-1,永遠等待;timeout==0,不等待;timeout>0,等待timeout毫秒。

說明:由於前幾天剛看了socket本地程序間通訊,所以就在此基礎上進行poll()的使用。

我們知道,預設情況下,tcp下的accept和udp下的recvfrom都是阻塞型,直到有client給其傳送資料才會返回。我們可以在accept或者recvfrom之前呼叫poll來幫我們監聽,等監聽的檔案描述符有變化了再去accept或者recvfrom。

本例子用socket本地程序間通訊,基於udp的。server端一共開啟了兩個本地socket檔案描述符,將其加入poll監聽池中,設定timeout為-1,即永久等待。然後client端分別向兩個檔案描述符傳送資料,看看server端會有什麼樣的輸出。下面給出**。

用client往udp_tmp0傳送字串:

用client往udp_tmp1傳送字串: 

Vim編輯器 適合小白的學習筆記

vim編輯器 a 在游標後輸入 i 在游標前輸入 a 在行尾輸入 i 在行首輸入 1 游標跳 2 單詞跳 3 行首行尾跳 4 行間移動 5 句間 段落間移動 7 字元替換 8 字元刪除 9 複製 貼上 10 撤銷 11 搜尋 n1,n2s word1 word2 g 在第n1與n2行之間尋找word...

02 Shell指令碼 適合小白的學習筆記

shell 開啟vim文字編輯器,新建乙個檔案test.sh,副檔名.sh shell 並不影響指令碼執行,也可不寫 root localhost vim test.sh 建立test.s 件,字尾名告知系統用bash來執行 編寫如下 bin bash shell指令碼提示行 echo hello ...

隨機函式學習筆記

在c語言中 來自rand 函式產生乙個隨機數 0到 0x7fff 之間 原型為int rand void srand 函式和 rand函式配合使用,產生隨機數的起始發生資料原型為 void srand unsigned seed 兩者對應的標頭檔案均為 stdlib.h stdlib.h中有如下定義...