eventfd、timerfd_create使用

博客介绍了eventfd和timerfd_create的使用。eventfd可在pipe仅用于发出事件信号时替代,可使用操作文件的方法操作,支持IO多路复用。timerfd是Linux的定时器接口,基于文件描述符,通过可读事件超时通知,能用于select/poll场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eventfd()使用场景

在 pipe 仅用于发出事件信号的所有情况下,都可以使用 eventfd 取而代之。

example

int createEventfd()
{
  int evtfd = ::eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
  if (evtfd < 0)
  {
    LOG_SYSERR << "Failed in eventfd";
    abort();
  }
  return evtfd;
}

EFD_NONBLOCK 表示创建的文件描述符非阻塞,read和write都不会阻塞;
EFD_CLOEXEC表示在执行fork或者exec后都不会继承父进程的打开状态;

操作方式

操作方法
一切皆为文件是 Linux 内核设计的一种高度抽象,eventfd 的实现也不例外,我们可以使用操作文件的方法操作 eventfd。

read(): 读取 count 值后置 0。如果设置 EFD_SEMAPHORE,读到的值为 1,同时 count 值递减 1。
write(): 其实是执行 add 操作,累加 count 值。
epoll()/poll()/select(): 支持 IO 多路复用操作。
close(): 关闭文件描述符,eventfd 对象引用计数减 1,若减为 0,则释放 eventfd 对象资源。

timerfd_create()使用场景

timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景。

使用

#include <sys/timerfd.h>

int timerfd_create(int clockid, int flags);

int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);

int timerfd_gettime(int fd, struct itimerspec *curr_value);
int createTimerfd()
{
  // 创建一个 时间 fd
  int timerfd = ::timerfd_create(CLOCK_MONOTONIC,
                                 TFD_NONBLOCK | TFD_CLOEXEC);
  if (timerfd < 0)
  {
    LOG_SYSFATAL << "Failed in timerfd_create";
  }
  return timerfd;
}

TFD_NONBLOCK 表示非阻塞的文件描述符
TFD_CLOEXEC 表示fork或者exec后自动关闭,不会继承父进程的打开状态
CLOCK_MONOTONIC 是单调时间,即从某个时间点开始到现在过去的时间,用户不能修改这个时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值