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可讀寫時,那麼就只會返...