LinuxIO多路復用之epoll

2021-08-08 07:41:09 字數 1453 閱讀 7335

/*

談到epoll,首先談一下select和poll,我們發現這兩種方式儲存監聽檔案描述符的方式為陣列 ,然後返回的是監聽描述符中就緒的個數

我們如果要進行處理 我們還得去監聽檔案描述符的陣列乙個乙個遍歷 去判斷哪個檔案描述符就緒 才去處理資料

而epoll內部用於儲存監聽檔案描述符的資料型別為紅黑樹 樹這種資料型別的有點繼承了鍊錶和陣列的優點 因此查詢和刪除節點都會很快

並且epoll還為就緒的檔案描述符維護了乙個佇列,因此我們要對這些檔案描述符進行處理時 只需要從佇列中獲取檔案描述符就可以了

int epoll_create(int size);引數size為核心監聽檔案描述符的個數 即紅黑樹內部節點的最多的個數

返回乙個檔案描述符 相當於我們可以通過這個檔案描述符去得到紅黑樹的根節點

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)

epfd為epoll_create的返回值

op為操作的方式 epoll_ctl_add 增加(註冊新的fd到epfd中) epoll_ctl_del 刪除(將fd從epfd中移除) epoll_ctl_mod(修改epfd中fd的屬性)

相當於增加 刪除 修改樹的節點

event 為fd的屬性 可讀 可寫 異常即要監聽檔案描述符的什麼屬性

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)epfd為epoll_create的返回值

*events 用於接收就緒對列檔案描述符的首位址

maxevents 相當於就緒對列的大小(很明顯,這個值要小於epoll_create中size的大小,就緒的描述符個數肯定小於監聽的檔案描述符個數)

timeout 超時時間 -1阻塞 0立即返回 >0指定的微秒數

返回值相當於就緒對列的中元素的個數

*/#include #include #include #include #include #include #include #include #include #define servport 8080

#define maxsize 1024

#define maxline 128

void sys_err(const char *fun_str,int exitno)

int main(void)

}else

epoll_ctl(epfd, epoll_ctl_del, sockfd, &event_tmp);

close(sockfd);

printf("client[%d] closed\n",i);}}

else}}

} }close(listenfd);

close(epfd);

return 0;

}

LinuxIO多路復用之select

listen 中backlog的值為兩個連線佇列的和 已完成連線佇列 和正處於三次握手的待連線佇列 ret listen sockfd,20 if 1 ret printf waiting for connnect n for i 0 imaxi if connfd maxfd 說明已經處理完客戶端...

Linux IO多路復用

一.select 函式 include include include int select int n,fd set readfds,fd set writefds,fd set exceptfds,struct timeval timeout fd clr int fd,fd set set f...

Linux IO多路復用之epoll網路程式設計

本章節是用基本的linux基本函式加上epoll呼叫編寫乙個完整的伺服器和客戶端例子,可在linux上執行,客戶端和服務端的功能如下 客戶端從標準輸入讀入一行,傳送到服務端 服務端從網路讀取一行,然後輸出到客戶端 客戶端收到服務端的響應,輸出這一行到標準輸出 如下 include include b...