使用epoll驱动ucontext - phxrpc代码阅读(5)
用pipe叫醒你 — EpollNotifier
class EpollNotifier
类型封装了一个使用pipe传递信号的Notifier类。
Run()
函数(其实我觉得叫Register或Activate会更好)首先声明了两个单向的pipe:pipe_fds_
,从文档中我们可以知道pipe_fds_[0]
是读管道,而pipe_fds_[1]
是写管道。这里有一丁点反直觉,就是pipe拿了两个fd,但是仍旧是单工的。
然后将读fd设为O_NONBLOCK
以供epoll调度,最后将Func()
函数传入scheduler_
中。
这里跑个题,想起了当年我大一的时候上过的通信导论的选修课。那会我还没有沉迷代码,还是一个积极乐观好好学习的新时代大学生。自从开始写了代码,人就越来越废物了,连女朋友都找不到了。
年轻人们啊,有饭辙干点啥都行,千万别写码啊。
Func()
函数做的事情很简单,就是从管道里尝试poll一段数据,拿到数据后直接扔掉。因为管道里传来的数据并没有实际意义,这样设计的主要意义在于唤醒epoll。
我们可以从Notify()
函数中看出 …