Linux Kernel 2.6.22版本起加入eventfd机制,部分应用场景下可用于替代pipe.
通常在事件机制里对信号的处理是这样的 :
事件处理伪代码 :
void event_proess(int fd) {
do {
read_pipe(); //读取pipe内容
process_pipe_event(); //转换pipe内容到对应的自定义信号
} while (true);
}
这么做的缺点在于需要处理读取到pipe的buf,映射到对应的事件.
而eventfd不需要做事件映射
事件处理伪代码 :
void event_proess(int fd) {
do {
read_eventfd(); //读取eventfd
} while (true);
}
这里列举一下eventfd的api :
#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
eventfd实质上就是生成了由用户操作的一个文件句柄,可以被加入到epoll/select这样的poll机制里.
获取信号时 只需要读取fd 得到对应的写入值 适合用作自定义信号处理
创建 :
int fd = eventfd(0, EFD_CLOEXEC);
设置信号:
#define SIGNAL_POST 0x1
#define SIGNAL_GET 0x2
uint64_t val = SIGNAL_POST
ssize cnt = write(fd, &val, sizeof(val));
读取信号:
uint64_t val = 0;
ssize cnt = read(fd, &val, sizeof(val));
if (val == SIGNAL_POST) {
...
} else if (val == SIGNAL_GET) {
...
}
...