eventfd与多路复用结合实现进程/线程间通讯

     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事件线程。

猜你喜欢

转载自blog.csdn.net/qq_19825249/article/details/108447841