網路程式設計15 epoll的使用

2021-10-01 11:22:27 字數 1962 閱讀 8070

建立epoll

int

epoll_create

(int size)

;int

epoll_create1

(int flags)

;返回值: 若成功返回乙個大於0的值,表示epoll例項;若返回-

1表示出錯

epoll_create建立乙個epoll例項,從linux2.6.8開始,引數size被自動忽略。但是該值仍然需要乙個大於零的整數。這個epoll例項用來呼叫epoll_ctl和epoll_wait。當這個epoll例項不再需要的時候則呼叫close方法關閉

(size一開始的作用時告訴linux核心檔案描述符字大小用來初始化linux核心資料結構)

epoll_create1的用法和epoll_create基本一致,如果epoll_create1的flags引數為0則用法和epoll_create一樣

修改描述符事件

int

epoll_ctl

(int epfd,

int op,

int fd,

struct epoll_event *event)

; 返回值: 若成功返回0;若返回-

1表示出錯

op:代表新增、刪除、修改描述符事件

typedef

union epoll_data epoll_data_t;

struct epoll_event

;

對應的events事件型別

epoll_wait:

int

epoll_wait

(int epfd,

struct epoll_event *events,

int maxevents,

int timeout)

; 返回值: 成功返回的是乙個大於0的數,表示事件的個數;返回0表示的是超時時間到;若出錯返回-

1.

epoll使用示例

#include

"lib/common.h"

#define maxevents 128

char

rot13_char

(char c)

intmain

(int argc,

char

**ar**)

event.data.fd = listen_fd;

event.events = epollin | epollet;if(

epoll_ctl

(efd, epoll_ctl_add, listen_fd,

&event)==-

1)/* buffer where events are returned */

events =

calloc

(maxevents,

sizeof

(event));

while(1

)else

if(listen_fd == events[i]

.data.fd)

else

}continue;}

else

break;}

else

if(n ==0)

elseif(

write

(socket_fd, buf, n)

<0)

}}}}

}free

(events)

;close

(listen_fd)

;}

edge-triggered vs level-triggered

條件觸發的意思是只要滿足事件的條件,比如有資料需要讀,就一直不斷地把這個事件傳遞給使用者;而邊緣觸發的意思是只有第一次滿足條件的時候才觸發,之後就不會再傳遞同樣的事件了。

python 網路程式設計 epoll的大坑

eopll 例項預設監聽 select.epollhup 一般只需要監聽select.epollin事件就行了 在另一方關閉連線時會傳送乙個空串,select.epollin 會捕捉這個空串事件,如果不對它處理的話這個事件會一直響應,需要手動關閉 connection.close 一般將所有連線的描...

linux網路程式設計之 epoll

include include include include include include include include include include using namespace std define maxline 5 define open max 100 define listen...

epoll監聽檔案 epoll的使用

epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為...