3 个版本
0.1.3 | 2024 年 4 月 12 日 |
---|---|
0.1.1 | 2024 年 4 月 12 日 |
0.1.0 | 2024 年 4 月 12 日 |
#241 在 Unix API
每月 39 次下载
14KB
176 代码行
PID 集合库
pid_set
库提供了在 Linux 平台上使用 epoll 管理和监控进程标识符 (PIDs) 的工具。它利用 epoll 和 pidfd 异步通知进程退出,提供了一种处理 PID 相关事件的强大方式。
动机
开发 PidSet crate 的主要动机来自 Rust 标准库的一个限制,特别是针对 std::process::Child struct,该结构用于表示子进程。标准 Child struct 提供了 wait 和 try_wait 方法,该方法会阻塞整个系统线程,直到子进程退出。这种阻塞行为对于在单个线程中高效管理多个子进程来说并不理想。
PidSet crate 通过利用 Linux 的 epoll 和 pidfd 功能来解决这个问题,使得可以非阻塞和异步地监控多个进程。通过使用 epoll,PidSet 允许程序“监视”多个子进程,并接收它们状态变化(如终止)的通知,而不需要为每个子进程阻塞一个线程。这对于需要同时管理多个子进程的应用程序特别有用,无需为每个进程分配单独的线程仅用于等待其完成。
手册页
- https://man7.org/linux/man-pages/man2/pidfd_open.2.html
- https://man7.org/linux/man-pages/man2/epoll_create.2.html
- https://man7.org/linux/man-pages/man2/epoll_ctl.2.html
特性
- 管理多个 PIDs:轻松跟踪和管理多个进程标识符。
- 异步监控:使用 epoll 进行高效的事件通知。
- 错误处理:包括全面的错误处理来优雅地管理系统调用失败。
WIP 特性
- 插入/删除功能
- 将持续时间参数添加到等待函数(破坏性更改)
先决条件
此库旨在用于支持 epoll
和 pidfd_open
的 Linux 系统。在使用库之前,请确保您的系统满足这些要求。
安装
将 pid_set
添加到您的 Cargo.toml
依赖项
[dependencies]
pid_set = "0.1.0"
使用
use pid_set::{PidSet, PidSetError};
fn main() -> Result<(), PidSetError> {
// Example PIDs to monitor
let pids = vec![1234, 5678];
let mut pid_set = PidSet::new(pids);
// Wait for any one PID to exit
pid_set.wait_any()?;
// Clean up
pid_set.close()?;
Ok(())
}
API
PidSet::new(pids)
:创建一个新的PidSet,包含指定的进程ID。PidSet::wait_any()
:等待任意一个进程ID退出。PidSet::wait_all()
:等待所有进程ID退出。PidSet::close()
:关闭epoll文件描述符并清理资源。
依赖关系
~260–760KB
~18K SLoC