自定义信号处理机制 : eventfd

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 

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) {
...
}
...

你可能感兴趣的:(自定义信号处理机制 : eventfd)