[Linux] Linux中eventfd的使用

Linux中eventfd的使用

eventfd简介

eventfd是用来实现多进程或多线程之间的事件通知的,常见的事件通知机制除了eventfd外,还有条件变量和管道等 方式。

条件变量必须和互斥锁相结合使用,使用起来较麻烦,并且条件变量不能像eventfd一样为I/O事件驱动。

管道可以和I/O复用很好的融合,但是管道比eventfd多用了一个文件描述符,而且 管道内核还得给其管理的缓冲区,eventfd则不需要。

event的主要接口

eventfd的接口形式如下:

int eventfd(unsigned int initval, int flags);

eventfd()创建一个文件描述符,这个文件描述符用户可以通过等待其可读来实现事件通知,该通知靠内核来响应用户空间的应用事件。上述接口的第一个参数是由内核来保持的64位计数器,这个计算器由参数initval来初始化,一般设为0。

第二个参数flags可以为EFD_NONBLOCK或EFD_CLOEXEC。

实例

#include <sys/eventfd.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int fd;
uint64_t buffer;

void threadFunc(void) {
    int t;
    while (1) {
        t = read(fd, &buffer, sizeof(buffer));
        if (sizeof(buffer) < 8) {
            printf("buffer错误\n");
        }
        printf("t = %11u buffer = %11u\n", t, buffer);
        if (t == 8) {
            printf("唤醒成功\n");
        }
    }
}

int main() {
    uint64_t buf = 1;
    int ret;
    pthread_t tid;
    if ((fd = eventfd(0, 0)) == -1) {
        printf("创建失败\n");
    }
    if (pthread_create(&tid, NULL, threadFunc, NULL) < 0) {
        printf("线程创建失败\n");
    }
    while (1) {
        ret = write(fd, &buf, sizeof(buf));
        if (ret != 8) {
            printf("写错误\n");
        }
      sleep(2);
    }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值