libc_core/
poll.rs

1//! This module provides the `libc` types for Poll (polling).
2//!
3//! MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/include/poll.h>
4
5/// Poll 事件类型(类似于 epoll 的事件掩码)
6///
7/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/include/poll.h#L12>
8#[repr(C)]
9#[cfg_attr(
10    feature = "zerocopy",
11    derive(
12        zerocopy::FromBytes,
13        zerocopy::Immutable,
14        zerocopy::IntoBytes,
15        zerocopy::KnownLayout
16    )
17)]
18#[derive(Debug, Clone, PartialEq, Default)]
19pub struct PollEvent(u16);
20
21bitflags! {
22    impl PollEvent: u16 {
23        /// 无事件(默认值)
24        const NONE = 0;
25        /// 有数据可读
26        const IN = 0x001;
27        /// 有紧急数据可读(带外数据)
28        const PRI = 0x002;
29        /// 可写数据(缓冲区未满)
30        const OUT = 0x004;
31        /// 普通数据可读(等价于 POLLIN,用于区分优先级)
32        const RDNORM = 0x040;
33        /// 带外数据可读
34        const RDBAND = 0x080;
35        /// 普通数据可写(等价于 POLLOUT,用于区分优先级)
36        const WRNORM = 0x100;
37        /// 带外数据可写
38        const WRBAND = 0x200;
39        /// Linux 特有,可能与消息通知相关(通常不使用)
40        const MSG = 0x400;
41        /// 从 epoll 或 poll 实例中移除此文件描述符(Linux 特有)
42        const REMOVE = 0x1000;
43        /// 远端关闭(对端 shutdown write 或关闭 socket)
44        const RDHUP = 0x2000;
45        /// 错误事件(如写管道时接收端关闭)
46        /// 不需要显式监听,默认总是报告
47        const ERR = 0x008;
48        /// 挂起事件(如对端关闭连接)
49        /// 不需要显式监听,默认总是报告
50        const HUP = 0x010;
51        /// 无效的请求(如监听了一个无效的 fd)
52        /// 不需要显式监听,默认总是报告
53        const NVAL = 0x020;
54    }
55}
56
57#[repr(C)]
58#[cfg_attr(
59    feature = "zerocopy",
60    derive(
61        zerocopy::FromBytes,
62        zerocopy::Immutable,
63        zerocopy::IntoBytes,
64        zerocopy::KnownLayout
65    )
66)]
67#[derive(Debug, Clone, Default)]
68/// 用于 poll 系统调用的文件描述符结构体
69///
70/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/include/poll.h#L31>
71pub struct PollFd {
72    /// 文件描述符(File Descriptor),要监视的对象
73    pub fd: u32,
74    /// 期望监听的事件(如可读、可写等),由用户设置
75    pub events: PollEvent,
76    /// 实际发生的事件,由内核填写
77    pub revents: PollEvent,
78}