eventfeventfd是Linux 2.6.27内核版本加入的系统调用,主要可以用来进程/线程间通讯。用法很简单,通过调 用 int eventfd(unsigned int initval, int flags) 函数返回一个文件描述符,通过read和write函数进行进程/线程间通讯。
调用eventfd函数会创建一个eventfd对象,可以被用户空间的应用程序用来作为事件等待/通知机制。eventfd函数返回eventfd对象的文件描述符,通过操作文件描述符来进行事件等待和通知。eventfd对象包含一个由内核维护的64位的无符号整数(uint64_t),用read/write来读/写这个64位的无符号整数。
initval参数:initval 用来初始化eventfd对象包含的64位无符号整数。
flags参数:flags是eventfd文件描述符的标志,通过设置标志位来设置描述符。
EFD_CLOEXEC:表示返回的eventfd文件描述符在fork后exec其他程序时会自动关闭这个文件描述符;
EFD_NONBLOCK:设置返回的eventfd非阻塞;
int eventFd = ::eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
write函数通过eventfd对象的文件描述符可以向eventfd对象维护的64位的无符号整数写入数据。
uint64_t one = 1;
size_t n = ::write(eventFd, &one, sizeof one);
read函数通过eventfd对象的文件描述符来读取ventfd对象维护的64位的无符号整数保存的数据。
uint64_t one = 1;
size_t n = ::read(eventFd, &one, sizeof one);
eventfd可以与poll/select/epoll配合使用。将eventfd加入进去,监听eventfd的读事件,这样可以与reactor模式结合,这开源网络库muduo中封装的reactor模型EventLoop中用到了eventfd用于唤醒等待读/写事件的I/O事件线程。