(PECL ev >= 0.2.0)
Ev 是一个静态类,提供对默认循环和一些常见操作的访问。
传递给创建循环的标志
Ev::FLAG_AUTO
默认标志值
Ev::FLAG_NOENV
如果使用此标志(或程序以 setuid 或 setgid 运行),libev
不会查看环境变量 LIBEV_FLAGS
。 否则(默认情况下),如果找到 LIBEV_FLAGS
,它将完全覆盖标志。 对于性能测试和搜索错误很有用。
Ev::FLAG_FORKCHECK
使 libev 在每次迭代中检查是否分叉,而不是手动调用 EvLoop::fork()
。 这是通过在循环的每次迭代中调用 getpid()
来实现的,因此这可能会减慢事件循环,因为循环迭代次数很多,但通常不会注意到。 此标志设置不能被覆盖或在 LIBEV_FLAGS
环境变量中指定。
Ev::FLAG_NOINOTIFY
当指定此标志时,libev
不会尝试使用 inotify
API 来处理其 » ev_stat 监视器。 该标志可用于节省 inotify 文件描述符,因为否则每个使用 ev_stat
监视器的循环都会消耗一个 inotify
处理程序。
Ev::FLAG_SIGNALFD
当指定此标志时,libev
将尝试使用 signalfd
API 来处理其 » ev_signal (以及 » ev_child)监视器。 此 API 同步传递信号,这使其更快,并且可以使获取排队的信号数据成为可能。 它还可以简化使用线程的信号处理,只要在线程中正确地阻塞信号。 默认情况下不会使用 Signalfd
。
Ev::FLAG_NOSIGMASK
当指定此标志时,libev
会避免修改信号掩码。 具体来说,这意味着必须确保在接收信号之前解除对信号的阻塞。
此行为对于自定义信号处理或仅在特定线程中处理信号很有用。
传递给 Ev::run()
或 EvLoop::run()
的标志
Ev::RUN_NOWAIT
表示事件循环将查找新事件,处理这些事件和任何已发生的事件,但不会等待并阻塞进程,以防没有事件,并在循环执行一次后返回。 这有时用于在进行冗长的计算时轮询和处理新事件,以保持程序的响应能力。
Ev::RUN_ONCE
表示事件循环将查找新事件(如果需要,等待)并处理这些事件以及任何已发生的事件。 它将阻塞进程,直到至少到达一个新事件(这可能是 libev 本身内部的事件,因此不能保证会调用用户注册的回调),并在循环执行一次后返回。
传递给 Ev::stop()
或 EvLoop::stop()
的标志
Ev::BREAK_CANCEL
取消中断操作。
Ev::BREAK_ONE
使最里面的 Ev::run()
(或 EvLoop::run()
)调用返回。
Ev::BREAK_ALL
使所有嵌套的 Ev::run()
(或 EvLoop::run()
)调用返回。
监视器优先级
Ev::MINPRI
允许的最小监视器优先级。
Ev::MAXPRI
允许的最大监视器优先级。
(接收的)事件的位掩码
Ev::READ
EvIo
监视器中的文件描述符已变为可读。
Ev::WRITE
EvIo
监视器中的文件描述符已变为可写。
Ev::TIMER
EvTimer
监视器已超时。
Ev::PERIODIC
EvPeriodic
监视器已超时。
Ev::SIGNAL
在 EvSignal::__construct()
中指定的信号已接收。
Ev::CHILD
在 EvChild::__construct()
中指定的 pid
已收到状态更改。
Ev::STAT
在 EvStat
监视器中指定的路径已更改其属性。
Ev::IDLE
EvIdle
监视器在没有其他监视器可执行的操作时工作。
Ev::PREPARE
所有 EvPrepare
监视器在 Ev::run()
开始之前被调用。 因此,EvPrepare
监视器是在事件循环休眠或轮询新事件之前调用的最后一个监视器。
Ev::CHECK
所有 EvCheck
监视器在 Ev::run()
收集到新事件之后被排队,但在排队接收到的任何事件的任何回调之前。 因此,EvCheck
监视器将在事件循环迭代中在相同或更低优先级的任何其他监视器之前被调用。
Ev::EMBED
EvEmbed
监视器中指定的嵌入式事件循环需要关注。
Ev::CUSTOM
从未被 libev
本身发送(或以其他方式使用),但可以由 libev
用户随意使用来发出监视器信号(例如,通过 EvWatcher::feed()
)。
Ev::ERROR
发生了未指定的错误,监视器已停止。 这可能发生是因为监视器无法正常启动,因为 libev
内存不足,发现文件描述符已关闭或其他任何问题。 Libev
将这些视为应用程序错误。 另请参见 » ANATOMY OF A WATCHER
后端标志
Ev::BACKEND_SELECT
select(2) 后端
Ev::BACKEND_POLL
poll(2) 后端
Ev::BACKEND_EPOLL
Linux 特定 epoll(7)
后端,用于 2.6.9 之前的内核和 2.6.9 之后的内核
Ev::BACKEND_KQUEUE
kqueue
后端,用于大多数 BSD 系统。 EvEmbed
监视器可用于将一个循环(使用 kqueue 后端)嵌入到另一个循环中。 例如,可以尝试使用 kqueue
后端创建事件循环,并将其用于套接字。
Ev::BACKEND_DEVPOLL
Solaris 8 后端。 这尚未实现。
Ev::BACKEND_PORT
Solaris 10 事件端口机制,具有良好的可扩展性。
Ev::BACKEND_ALL
尝试所有后端(即使是损坏的后端)。 不建议显式使用它。 这里应该应用按位运算符(例如 Ev::BACKEND_ALL
& ~ Ev::BACKEND_KQUEUE
)。 使用 Ev::recommendedBackends()
,或者根本不指定任何后端。
Ev::BACKEND_MASK
不是后端,而是从 flags
值中选择所有后端位的掩码,以屏蔽任何后端(例如,当修改 LIBEV_FLAGS
环境变量时)。
注意:
在模块初始化阶段,对于默认循环,
Ev
通过pthread_atfork
(如果可用)注册 » ev_loop_fork 调用。
注意:
在
Ev
类中有一些方法提供了对默认事件循环的访问(例如Ev::iteration()
、Ev::depth()
等)。 对于自定义循环(使用EvLoop::__construct()
创建),可以通过EvLoop
类的相应属性和方法访问这些值。默认事件循环本身的实例可以通过
EvLoop::defaultLoop()
方法获取。