Skip to main content

核心概念

event ring C API 中有两个核心对象:
  1. struct monad_event_ring - 表示一个已将其共享内存段映射到当前进程地址空间的 event ring;客户端对该对象最主要的用途是使用它初始化指向 event ring 的迭代器,使用 monad_event_ring_init_iterator 函数
  2. struct monad_event_iterator - 主角:该迭代器对象用于顺序读取事件。迭代器的 try_next 操作会拷贝当前事件描述符(如果可用),如果成功则推进迭代器。概念上其行为类似表达式 descriptor = *i++,前提是有事件描述符立即就绪(否则什么也不做)
理解该 API 最简单的方式是编译并运行随附的 eventwatch 示例程序。该程序将执行事件的 ASCII 表示形式转储到 stdout,这些事件由运行在同一主机上的执行层守护进程写入。 eventwatch 中,事件描述符被完全解码,但事件负载仅以十六进制转储形式显示,因为这个简单程序不包含所有事件负载类型的美化打印逻辑。该程序仅 250 行代码,通读它应能解释各个 API 调用如何协同工作。 SDK 还包括 C++20 std::formatter 特化,可将事件负载完全解码为人类可读形式。这些被 monad-event-cli 实用程序使用。

在您的项目中使用 API

libmonad_event 面向第三方集成设计,因此除了较新版本的 glibc 外没有其他库依赖。这也意味着它不依赖 monad 仓库的其他部分或其构建系统:唯一要求是支持 C23 的 C 编译器。 构建 C 示例程序的”开始使用”指南讨论了多种方法将 SDK 库作为第三方依赖用于您的代码。或者,可以将组成库目标的源文件复制到您自己的代码库中。也提供了 Rust 客户端库

API 概览

event ring API

所有可能失败的函数都会返回 errno(3) 域错误码,说明失败原因。可调用 monad_event_ring_get_last_error 函数以提供失败原因的人类可读字符串说明。

事件迭代器 API

event ring 实用 API

库组织

libmonad_event 中的 event ring 文件: libmonad_event 中的执行事件文件: libmonad_event 中的支持文件: SDK 中的其他文件:

Footnotes

  1. 默认情况下,这会返回 hugetlbfs 挂载上的路径,由 libhugetlbfs 计算得出
  2. 如果使用 MONAD_EVENT_USE_LIBHUGETLBFS=OFF 编译,则必须指定默认 event ring 目录;详情见此处