自定义信号处理机制 : 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 <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) {
...
}
...
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容