1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//! 特定于 Unix 的通用 I/O 原语扩展。
//!
//! 就像裸指针一样,原始文件描述符指向具有动态生命周期的资源,如果它们比它们的资源生命周期更长,它们可以悬垂,如果它们是由无效值创建的,则它们可以被伪造。
//!
//! 该模块提供了三种用于表示文件描述符的类型,具有不同的所有权属性:原始、借用和拥有,类似于用于表示指针的类型:
//!
//! | Type               | Analogous to |
//! | ------------------ | ------------ |
//! | [`RawFd`]          | `*const _`   |
//! | [`BorrowedFd<'a>`] | `&'a _`      |
//! | [`OwnedFd`]        | `Box<_>`     |
//!
//! 和裸指针一样,`RawFd` 值是原始值。
//! 并且在新代码中,他们应该被认为是不安全的 (类似于解引用他们)。Rust 并不总是提供此指导,因此 Rust 生态系统中的现有代码通常不会将 `RawFd` 的使用标记为不安全。
//! 一旦 `io_safety` 特性稳定,将鼓励库迁移,通过将 `unsafe` 添加到解引用 `RawFd` 值的 API,或者使用 `BorrowedFd` 或 `OwnedFd` 代替。
//!
//! 与引用一样,`BorrowedFd` 值与生命周期相关联,以确保它们的生命周期不会超过它们指向的资源。这些可以安全使用。`BorrowedFd` 值可用于提供对任何系统调用的安全访问的 API 中,除了:
//!  - `close`,因为这将结束资源的动态生命周期,而不结束文件描述符的生命周期。
//!  - `dup2`/`dup3`,在第二个参数中,因为这个参数被关闭并分配了一个新的资源,这可能会破坏其他代码使用该文件描述符的假设。
//! 此列表不包括 `mmap`,因为 `mmap` 确实对其文件描述符参数进行了适当的借用。也就是说,`mmap` 是不安全的还有其他原因:它在裸体疗法上运行,如果底层存储发生可变,它可能会有未定义的行为。
//!
//! 可变的可能来自其他进程,或者来自同一进程,如果 API 提供 `BorrowedFd` 访问,因为如前所述,`BorrowedFd` 值可能用于提供对任何系统调用的安全访问的 API。
//! 因此,使用 `mmap` 并提供安全 API 的代码必须全权负责确保安全的 Rust 代码不会通过它引起未定义的行为。
//!
//! 与 box 一样,`OwnedFd` 在概念上拥有它们指向的资源,并在它们被丢弃时释放 X1X。
//!
//! [`BorrowedFd<'a>`]: crate::os::unix::io::BorrowedFd
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!
//!

#![stable(feature = "rust1", since = "1.0.0")]

mod fd;
mod raw;

#[unstable(feature = "io_safety", issue = "87074")]
pub use fd::*;
#[stable(feature = "rust1", since = "1.0.0")]
pub use raw::*;