#子进程 #epoll #pid #wait #linux #async

bin+lib pid-set

通过 epoll 执行高效的等待操作的过程标识符集合

3 个版本

0.1.3 2024 年 4 月 12 日
0.1.1 2024 年 4 月 12 日
0.1.0 2024 年 4 月 12 日

#241Unix API

每月 39 次下载

MIT/Apache

14KB
176 代码行

Continuos Integration dependency status

PID 集合库

pid_set 库提供了在 Linux 平台上使用 epoll 管理和监控进程标识符 (PIDs) 的工具。它利用 epoll 和 pidfd 异步通知进程退出,提供了一种处理 PID 相关事件的强大方式。

动机

开发 PidSet crate 的主要动机来自 Rust 标准库的一个限制,特别是针对 std::process::Child struct,该结构用于表示子进程。标准 Child struct 提供了 waittry_wait 方法,该方法会阻塞整个系统线程,直到子进程退出。这种阻塞行为对于在单个线程中高效管理多个子进程来说并不理想。

PidSet crate 通过利用 Linux 的 epoll 和 pidfd 功能来解决这个问题,使得可以非阻塞和异步地监控多个进程。通过使用 epoll,PidSet 允许程序“监视”多个子进程,并接收它们状态变化(如终止)的通知,而不需要为每个子进程阻塞一个线程。这对于需要同时管理多个子进程的应用程序特别有用,无需为每个进程分配单独的线程仅用于等待其完成。

手册页

特性

  • 管理多个 PIDs:轻松跟踪和管理多个进程标识符。
  • 异步监控:使用 epoll 进行高效的事件通知。
  • 错误处理:包括全面的错误处理来优雅地管理系统调用失败。

WIP 特性

  • 插入/删除功能
  • 将持续时间参数添加到等待函数(破坏性更改)

先决条件

此库旨在用于支持 epollpidfd_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