1 unstable release
Uses new Rust 2024
| new 0.0.1 | Feb 27, 2026 |
|---|
#35 in #linux-process
14KB
189 lines
waitpidx
waitpidx provides Linux process waiting by PID (not limited to child processes).
It uses pidfd_open(2) + poll(2) under the hood and supports both:
- synchronous waiting
- asynchronous waiting with Tokio
Requirements
- Linux only
- Kernel
>= 5.3(pidfd_open) - Rust stable (Edition 2024)
Install
[dependencies]
waitpidx = "0.0.1"
Disable default async feature when you only need sync API:
[dependencies]
waitpidx = { version = "0.0.1", default-features = false }
Quick start
Sync API
use std::{process::Command, time::Duration};
fn main() -> std::io::Result<()> {
let mut child = Command::new("sleep").arg("0.1").spawn()?;
waitpidx::waitpid(child.id(), Some(Duration::from_secs(5)))?;
child.wait()?;
Ok(())
}
Async API (Tokio)
use std::process::Command;
#[tokio::main(flavor = "current_thread")]
async fn main() -> std::io::Result<()> {
let mut child = Command::new("sleep").arg("0.1").spawn()?;
waitpidx::waitpid_async(child.id()).await?;
child.wait()?;
Ok(())
}
Public API
waitpid(pid, timeout)- Wait for process exit with optional timeout.
- Returns
TimedOutwhen timeout expires.
waitpid_async(pid)- Async wait for process exit.
pidfd::PidFd/pidfd::AsyncPidFd- Low-level wrappers if you need reusable wait handles.
process_exists(pid)- Cheap existence check based on signal 0 semantics.
Error behavior
Common std::io::ErrorKind values:
InvalidInput: invalid PID (for example0), or invalid timeout conversionTimedOut: timeout reached in sync waitNotFound/PermissionDenied/ others: forwarded from OS (pidfd_open,poll, etc.)
Features
async(default): enables Tokio-based async API
Examples
Run included examples:
cargo run --example waitpid -- <pid>
cargo run --example waitpid_async --features async -- <pid>
cargo run --example waitpid_many_async --features async -- <pid1> <pid2>
License
Apache-2.0
Dependencies
~2–14MB
~143K SLoC