7个版本
0.3.2 | 2021年6月5日 |
---|---|
0.3.1 | 2021年2月26日 |
0.3.0 | 2021年1月3日 |
0.2.2 | 2020年9月13日 |
0.1.0 | 2020年8月10日 |
#222 in Unix APIs
12,096 monthly downloads
用于 10 crates (4 directly)
79KB
1.5K SLoC
close_fds
一个小的Rust库,可以轻松关闭所有打开的文件描述符。
用法
在您的 Cargo.toml
中添加
[dependencies]
close_fds = "0.2"
在您的应用程序中
use close_fds::close_open_fds;
fn main() {
// ...
unsafe {
close_open_fds(3, &[]);
}
// ...
}
重要:请阅读 close_open_fds()
的文档,了解为什么它是 unsafe
的。
close_open_fds()
的第一个参数是要关闭的最低文件描述符;小于此文件描述符的所有文件描述符都将保持打开状态。第二个参数是一个包含应该保持打开状态的其他文件描述符列表的切片。(注意:如果此列表已排序,特别是如果列表长度超过几个元素,则 close_open_fds()
将更加高效。)
close_open_fds()
总是 成功。如果关闭文件描述符的一种方法失败,它将回退到另一种方法。
更多详细信息以及其他有用的函数可以在 文档 中找到。
操作系统支持
close_fds
有两个操作系统支持等级,类似于 Rust 的支持等级
第一级:“保证可用”(在CI中测试过)
- Linux(glibc和musl)
- macOS
- FreeBSD
第二级:“保证构建”(在CI中构建,但未测试)
- NetBSD
- OpenBSD
- DragonflyBSD
- Solaris
- Illumos
注意:如 许可证 所述,close_fds
不提供任何保证。
操作系统特定说明
以下是此crate将在各种平台上尝试的方法列表,以提高列出打开文件描述符时的性能
- Linux
/proc/self/fd
如果/proc
已挂载(非常高效)
- macOS
/dev/fd
(非常高效)
- FreeBSD
/dev/fd
如果在那里挂载了fdescfs
(非常高效)- 通过
kern.proc.nfds
系统调用获取打开文件描述符的数量(除非大量文件描述符打开,否则效率中等;"线程安全"函数或关闭文件描述符时不会使用)
- OpenBSD
- 使用
getdtablecount()
获取打开文件描述符的数量(除非大量文件描述符打开,否则效率中等;"线程安全"函数或关闭文件描述符时不会使用)
- 使用
- NetBSD
/proc/self/fd
如果/proc
已挂载(非常高效)- 使用
fcntl(0, F_MAXFD)
获取最大打开文件描述符(效率中等)
- Solaris 和 Illumos
- 如果可用,则使用
/dev/fd
或/proc/self/fd
(非常高效)
- 如果可用,则使用
在关闭文件描述符或设置 close-on-exec 标志时,此库还可能在 BSDs 上调用 closefrom()
,或在 Linux 5.9+/FreeBSD 12.2+ 上调用 close_range()
,这两个方法都非常高效。
如果上述方法都不可用,它将回退到遍历所有可能的文件描述符编号的简单循环——从 minfd
到 sysconf(_SC_OPEN_MAX)
。这很慢,但总是有效。
注意:最常见的用法,close_open_fds(3, &[])
,在 Linux(挂载 /proc
或内核 5.9+)、macOS、所有 BSD 和 Solaris/Illumos 上都非常高效。