Crates.io | pid-set |
lib.rs | pid-set |
version | 0.1.3 |
source | src |
created_at | 2024-04-12 09:50:22.229472 |
updated_at | 2024-04-12 15:10:14.428867 |
description | A processes identifier set to perform efficient wait operations using epoll |
homepage | https://github.com/rogercoll/pid-set |
repository | |
max_upload_size | |
id | 1206153 |
size | 16,062 |
The pid_set
library provides tools for managing and monitoring process identifiers (PIDs) using epoll on Linux platforms. It utilizes epoll and pidfd to asynchronously notify when a process exits, offering a robust way to handle PID-related events.
The primary motivation behind developing the PidSet crate stems from a limitation in Rust's standard library, particularly with the std::process::Child struct, which is used to represent child processes. The standard Child struct provides a wait and a try_wait method that blocks the entire system thread until the child process exits. This blocking behavior is not ideal for efficiently managing multiple child processes within a single thread.
The PidSet crate addresses this by leveraging Linux's epoll and pidfd functionalities, enabling non-blocking and asynchronous monitoring of multiple processes. By using epoll, PidSet allows a program to "watch" multiple child processes and receive notifications about changes in their state (like termination), without the need of blocking a thread for each child process. This is particularly useful in applications that need to manage several child processes concurrently without dedicating a separate thread to each process just to wait for its completion.
This library is intended for use on Linux systems with support for epoll
and pidfd_open
. Ensure your system meets these requirements before using the library.
Add pid_set
to your Cargo.toml
dependencies:
[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(())
}
PidSet::new(pids)
: Create a new PidSet with the specified PIDs.PidSet::wait_any()
: Wait for any one PID to exit.PidSet::wait_all()
: Wait for all PIDs to exit.PidSet::close()
: Close the epoll file descriptor and clean up resources.