1 是什么?
eventfd 是 Linux 系统提供的一种轻量级事件通知机制, 它允许用户态应用之间,或内核与应用之间,通过一个特殊的文件描述符来传递和等待事件。 其核心是一个由内核维护的 64位无符号整数计数器 (uint64_t)。简单来说,你可以把它想象成一个能跨线程/进程使用的计数器: 写事件:一个线程通过 write 操作增加计数器的值,代表“事件发生”。 读事件:另一个线程通过 read 操作读取并处理该值,代表“处理事件”2 如何使用 eventfd
创建 eventfd 使用 eventfd 函数创建,需要包含头文件 <sys/eventfd.h>。 initval 指定计数器初始值,flags 用于配置行为。#include<sys/eventfd.h>inteventfd(unsignedintinitval,intflags);initval: unsigned int 类型,指定 eventfd 内部计数器的初始值。 必须 ≥ 0,通常设为 0 表示初始无事件。 flags: int 类型,用于控制 eventfd 的行为。可以通过按位或(|)操作设置多个标志, 常见的标志包括 EFD_CLOEXEC、EFD_NONBLOCK 和 EFD_SEMAPHORE。 返回值:成功时返回一个新的文件描述符(非负整数);失败时返回 -1,并设置 errno 来指示具体错误。EFD_NONBLOCK: 以非阻塞方式打开。若计数器为0,read会立即返回EAGAIN错误,而不是阻塞等待。 EFD_CLOEXEC: 设置“exec时关闭”标志,在调用exec执行新程序时会自动关闭,可以防止文件描述符泄漏。 EFD_SEMAPHORE: 启用信号量语义。读取时,计数器的值会减1(而非清零),并且read始终返回1。写入事件 使用标准 write 函数向 eventfd 写入一个 uint64_t 类型的值, 该值会累加到内核计数器上 读取事件 使用 read 读取,会返回一个 uint64_t 类型的值, 并根据创建时是否设置 EFD_SEMAPHORE 而有不同行为默认模式(未设置EFD_SEMAPHORE): read成功读取后,计数器的值会被原子性地重置为0,并返回重置前的值。 信号量模式(设置了EFD_SEMAPHORE): read成功读取后,计数器的值会被原子性地减1,并固定返回1。