我是靠谱客的博主 直率西装,这篇文章主要介绍epoll边缘触发_Epoll笔记,现在分享给大家,希望可以做个参考。

下图为epoll的流程图:

82b5656a214825e19d1af8816807479e.png

epoll一共两种模式,水平触发(LT)和边缘触发(ET),主要的区别在于对读,写数据的处理:

9a9664504761767ce4788154a4834c4e.png
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//LT初始化 epoll_ctrl(connect_socket, EPOLLIN, ADD); ​ // LT读 void lt_handle_read() { // 如果读不完,下次epoll_wait一定会返回EPOLLIN while((n = read(connect_socket, read_buffer)) > 0) { // read_buffer为当前循环读取到的数据 } if (n < 0 && errno == EAGAIN) { // Resource temporarily unavailable, 无数据可读 } } ​ // LT写 void lt_handle_write() { // 一次性发满写缓冲区,这里写满的意图是:判断是否需要添加EPOLLOUT while((n = write(connect_socket, write_buffer)) > 0) { // write_buffer为当前循环发送的数据 } if (write_left == 0) { // 数据发送完毕,删除EPOLLOUT epoll_ctrl(connect_socket, EPOLLOUT, DELETE); } if (n < 0 && errno == EAGAIN) { // Resource temporarily unavailable, 写缓冲区满了,添加EPOLLOUT epoll_ctrl(connect_socket, EPOLLOUT, ADD); } } //ET初始化 epoll_ctrl(connect_socket, EPOLLET | EPOLLIN | EPOLLOUT, ADD); ​ // ET读 void et_handle_read() { // 这里要把数据读完,否则就是BUG了 while((n = read(connect_socket, read_buffer)) > 0) { // read_buffer为当前循环读取到的数据 } if (n < 0 && errno == EAGAIN) { // Resource temporarily unavailable, 无数据可读 } } ​ // ET写 void et_handle_write() { // 一次性发满写缓冲区 while((n = write(connect_socket, write_buffer)) > 0) { // write_buffer为当前循环发送的数据 } if (n < 0 && errno == EAGAIN) { // Resource temporarily unavailable, 写缓冲区满了,等待可写触发EPOLLOUT } }

于是总结出两种模式的优缺点:

ef20708232a2f16bd75f13c7ff75fa21.png

最后

以上就是直率西装最近收集整理的关于epoll边缘触发_Epoll笔记的全部内容,更多相关epoll边缘触发_Epoll笔记内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(107)

评论列表共有 0 条评论

立即
投稿
返回
顶部