17 2 邊緣觸發和條件觸發

2021-07-26 13:59:02 字數 2992 閱讀 9344

1.兩者區別:在於發生事件的時間點,條件觸發:只要輸入緩衝有資料就一直通知該事件;邊緣觸發:輸入緩衝受到資料時僅註冊一次事件。

epoll預設以條件觸發方式工作,select也是以條件觸發模式工作的。

2.條件觸發事件特性:

#include #include #include #include #include #include #include #define buf_size    4

#define epoll_size 50

void error_handling(char *message);

int main(int argc, char *argv)

serv_sock = socket(pf_inet,sock_stream,0);

if(serv_sock == -1)

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family=af_inet;

serv_adr.sin_addr.s_addr=htonl(inaddr_any);

serv_adr.sin_port=htons(atoi(argv[1]));

if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)

if(listen(serv_sock,5) == -1)

epfd = epoll_create(epoll_size);

ep_events = malloc(sizeof(struct epoll_event)*epoll_size);

event.events = epollin;

event.data.fd = serv_sock;

epoll_ctl(epfd,epoll_ctl_add,serv_sock,&event);

while(1)

puts("return epoll wait");

for(i=0;i

alex@alex-virtual-machine:/extra/tcpip/17$ ./a.out 9190

return epoll wait

connected client : 5

return epoll wait

return epoll wait

return epoll wait

return epoll wait

return epoll wait

return epoll wait

return epoll wait

return epoll wait

return epoll wait

3. 邊緣觸發

#include #include #include #include #include #include #include #include #include #define buf_size    4

#define epoll_size 50

void error_handling(char *message);

void setnonblockingmode(int fd);

int main(int argc, char *argv)

serv_sock = socket(pf_inet,sock_stream,0);

if(serv_sock == -1)

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family=af_inet;

serv_adr.sin_addr.s_addr=htonl(inaddr_any);

serv_adr.sin_port=htons(atoi(argv[1]));

if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)

if(listen(serv_sock,5) == -1)

epfd = epoll_create(epoll_size);

ep_events = malloc(sizeof(struct epoll_event)*epoll_size);

event.events = epollin;

event.data.fd = serv_sock;

epoll_ctl(epfd,epoll_ctl_add,serv_sock,&event);

while(1)

puts("return epoll wait");

for(i=0;i//設定成邊緣觸發

event.data.fd = clnt_sock;

epoll_ctl(epfd,epoll_ctl_add,clnt_sock,&event);

printf("connected client : %d \n", clnt_sock);

}elseelse if(str_len < 0)

}else

}

}} }

close(serv_sock);

close(epfd);

return 0;

}

void error_handling(char *message)

void setnonblockingmode(int fd)

執行結果:觸發一次

alex@alex-virtual-machine:/extra/tcpip/17$ ./a.out 9191

return epoll wait

connected client : 5

return epoll wait

5.

條件觸發與邊緣觸發比較:應該從伺服器端實現模型角度考慮。

邊緣觸發能夠做到接收資料與處理資料的時間點分離。

邊緣觸發和水平(條件)觸發

條件觸發 lt 和邊緣觸發 et 的區別在於事件的時間點 邊緣觸發 每當狀態變化時發生乙個io事件 條件觸發 只要滿足條件就發生乙個io事件 在條件觸發方式中,只要輸入緩衝有資料就會一直通知該事件。例如 伺服器輸入緩衝收到50位元組的資料時,伺服器端作業系統將通知該事件 註冊到發生變化的檔案描述符 ...

條件觸發和邊緣觸發 及 epoll 的優點

舉個讀socket的例子,假定經過長時間的沉默後,現在來了100個位元組,這時無論邊緣觸發和條件觸發都會產生乙個read ready notification通知應用程式可讀。應用程式讀了50個位元組,然後重新呼叫api等待io事件。這時條件觸發的api會因為還有50個位元組可讀從而立即返回使用者乙...

epoll的 LT 條件觸發和 ET 邊緣觸發

下面是二者的定義 條件觸發 lt 只要輸入緩衝有資料就會一直通知該事件 邊緣觸發 et 輸入緩衝收到資料時僅註冊1次該事件,即使輸入緩衝中還留有資料,也不會再進行註冊 從而我要說明的是,為什麼要強調邊緣觸發要使用非阻塞io 因為在伺服器端當epoll wait監聽到有客戶端fd可讀寫時,那麼就只會返...