1
fghjghf OP 写错了,EPOLLIN 是 1,而不是 4
|
2
pubby 2019-04-27 01:10:51 +08:00 via Android
EPOLLIN & EPOLLOUT == 5
|
4
AngryMagikarp 2019-04-27 01:58:08 +08:00
这个标志位是二进制或操作的结果,表示的就是“或”的意思。
比如 5 = 1 | 4 = EPOLLIN | EPOLLOUT = EPOLLIN 或 EPOLLOUT 你拿到 events 时,要判断有没有 EPOLLIN 事件,不能直接 events==EPOLLIN 判断,而要用 events & EPOLLIN 判断。表示 EPOLLIN 标志位是否已经设置,这是典型的 C 语言用法,毕竟 Python 里的 epoll 是移植自 C。 如果你仔细观察,就会发现这些标志的二进制表示都只有一个 1。如下 EPOLLIN: 0x00000001 EPOLLOUT: 0x00000100 EPOLLPRI: 0x00000010 EPOLLERR: 0x00001000 EPOLLHUP: 0x00010000 也正因为如此,才能使用上述的方式将多个标志放在一个 int 里。 |
5
AngryMagikarp 2019-04-27 02:01:19 +08:00
上面写错了,二进制应该是 0b 表示,而不是 0x。0x 表示十六进制。
EPOLLIN | EPOLLOUT 表示 0b00000001 | 0b00000100 = 0b00000101 = 5 |
6
fghjghf OP @AngryMagikarp 感谢,我当初就是直接用 events == EPOLLIN 去判断的。
|
7
fghjghf OP @AngryMagikarp 但还有个问题,对端发送 send 数据给服务端,为啥只会出发 5 呢,那肯定是谁先写,就先触发谁了,那岂不是 in 和 out 同时触发?这有什么意义呢
|
8
AngryMagikarp 2019-04-27 14:22:40 +08:00
|
9
fghjghf OP @AngryMagikarp 我这是 ET+非堵塞模式啦。看了下网上对 demo,终于懂了。原来是我是 in 和 out 一起注册了,才会老是返回 5,这是个错误的写法。应该是先注册 in,while 不断循环,直到 errno.EAGAIN。再注册 out 事件。对于 out 事件也是一样道理。感谢回答
|