6.1 创建事件
event_new()试图分配和构造一个用于 base 的新的事件。what 参数是上述标志的集合。
如果 fd 非负,则它是将被观察其读写事件的文件。
事件被激活时, libevent 将调用 cb 函数,
传递这些参数:文件描述符 fd,表示所有被触发事件的位字段 ,以及构造事件时的 arg 参数。
发生内部错误,或者传入无效参数时, event_new()将返回 NULL。
要释放事件,调用 event_free()。对未决或者激活状态的事件调用 event_free()是安全 的:在释放事件之前,函数将会使事件成为非激活和非未决的。
上述函数定义在
EV_READ
表示指定的文件描述符已经就绪,可以读取的时候,事件将成为激活的。EV_SIGNAL用于实现信号检测,请看下面的 “构造信号事件”节。
EV_PERSIST表示事件是“持久的”,请看下面的“关于事件持久性”节。
EV_ET
表示如果底层的 event_base 后端支持边沿触发事件,则事件应该是边沿触发的。这个标志 影响 EV_READ 和 EV_WRITE 的语义。
从2.0.1-alpha 版本开始,可以有任意多个事件因为同样的条件而未决。比如说,可以有两 个事件因为某个给定的 fd 已经就绪,可以读取而成为激活的。这种情况下,多个事件回调 被执行的次序是不确定的。
然而,如果设置了 EV_PERSIST 标志,事件就是持久的。这意味着即使其回调被激活 ,事件还是会保持为未决状态 。如果想在回调中让事件成为非未决的 ,可以对其调用 event_del ()。
每次执行事件回调的时候,持久事件的超时值会被复位。因此,如果具有 EV_READ|EV_PERSIST 标志,以及5秒的超时值,则事件将在以下情况下成为激活的:
- 套接字已经准备好被读取的时候
libevent 也可以监测 POSIX 风格的信号。要构造信号处理器,使用:
除了提供一个信号编号代替文件描述符之外,各个参数与 event_new()相同。
:不要在信号事件上设置超时,这可能是不被支持的。 [待修正:真是这样的吗?]
libevent 也提供了一组方便使用的宏用于处理信号事件:
evsignal_*宏从2.0.1-alpha 版本开始存在。先前版本中这些宏叫做 signal_add()、signal_del ()等等。