關於事件驅動的學習二 select

2021-05-22 22:05:08 字數 2127 閱讀 7406

通過前面學習aio的過程,理解select()介面就簡單了很多。

/* according to posix.1-2001 */#include<sys/select.h>

/* according to earlier standards */#include<sys/time.h>#include<sys/types.h>#include<unistd.h>int select(intnfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);void fd_clr(intfd, fd_set *set);int fd_isset(intfd, fd_set *set);void fd_set(intfd, fd_set *set);void fd_zero(fd_set *set);

select 介面的主要功能是用於檢查某個或某組的檔案控制代碼 是否狀態改變,譬如是否突然變可讀,可寫,timeout,或有exception等,如果這種改變(或稱event)發生,則返回有狀態改變的檔案控制代碼的數量。

整個select的關鍵是: 如何將檔案描述符(file descriptor) 跟乙個個event聯絡起來。

select()的做法是,使用乙個特徵數fd_set. fd_set的每個位都表示乙個fd值。舉個例子,fd_set的25位則表示fd=25,fd_set的26位則表示fd=26。這樣fd_set有多少位就可以標記多少個檔案控制代碼。

void fd_clr(intfd, fd_set *set); 用以清除某fd對應在fd_set上的對應位
void fd_set(intfd, fd_set *set);用於標記fd對應在fd_set上的對應位
void fd_zero(fd_set *set);        用於至零
int fd_isset(intfd, fd_set *set);用於檢查某個fd在fd_set上的對於位是否被標記
在看整個select介面:
int select(intnfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);引數nfds實際是多餘的,用於指定最大的控制代碼值,當然,如果指定的話,就減少了輪循的長度,減少了系統負擔。
譬如本次select呼叫涉及到的最大的控制代碼數值是233,則nfds最好設為234.
readfds  這是乙個fd_set特徵數。傳位址是因為select()函式未來要修改此值。如果有兩個檔案需要檢查是否出現readable事件,
那麼在這兩個fd需要用fd_set()在readfds上設定自己的特徵位。
writefds,exceptfds也是類似的功能,只是用來檢測是否有writable事件和exception事件 。
select還有個重大的功能是能夠堅持timeout事件。 有3種可能:
timeout=null,擁塞,知道有乙個fd位被置為1,select函式才返回
timeout=not zero, 等待固定時間,有乙個fd位被置為1或時間耗盡,則函式返回
timeout=zero,   非阻塞,函式檢查完每個fd後立即返回。
返回對應位為1的fd的總數目。
注意timeval的結構。
struct timeval
man select上就有個很好的例子,我稍做了修改:

#include #include #include #include int main(void)

Node學習筆記(二) 事件驅動

node.js使用事件驅動模型,當web server接收到請求,就把它關閉然後進行處理,然後去服務下乙個web請求。當這個請求完成,它被放回處理佇列,當到達佇列開頭,這個結果被返回給使用者。這個模型非常高效可擴充套件性非常強,因為webserver一直接受請求而不等待任何讀寫操作。這也被稱之為非阻...

關於事件驅動程式設計

關於事件驅動程式設計 全世界最熟悉事件驅動的程式設計師應該就是前端工程師了,不管是桌面前端還是web前端都是世界上最熟悉事件驅動的,以web前端為例,我們作業面可以不去想什麼物件導向程式設計,什麼jquery框架咋用,但是為按鈕,為頁面元素新增相關事件操作肯定是不可缺少的,而web前端的事件處理機制...

Linux驅動學習(二)

注 基於linux 2.6.38 還是 arch arm mach s3c64xx mach mini6410.c這個檔案,前面有篇文章已經說了裡面的mini6410 machine init 函式是什麼時候被呼叫的,因此在這裡不再重複,直接看這個函式裡面的內容 1 static void init...