11个版本 (2个稳定版)
1.0.1 | 2024年8月1日 |
---|---|
1.0.0 | 2021年11月16日 |
0.3.5 | 2021年3月15日 |
0.3.4 | 2019年9月7日 |
0.2.1 | 2017年2月12日 |
#42 in Operating systems
439,047 monthly downloads
在 339 个crates中使用 (直接使用19个)
29KB
361 代码行数(不包括注释)
shared_child.rs
一个用于在多个线程中等待和杀死子进程的库。
标准库中的std::process::Child
类型提供了wait
和kill
方法,这些方法接受&mut self
,这使得在另一个线程等待时无法杀死子进程。该设计绕过了Unix中waitpid
函数的竞争条件,因为在等待返回后,PID可能会立即被重用,所以在这个时间发送的信号可能会意外地发送到错误的过程。
然而,随着新的POSIX waitid
函数,我们可以在不释放其PID以供重用的情况下等待子进程。这使得可以并发地发送信号。Windows实际上一直支持这一点,通过在仍有子进程的打开句柄时防止PID重用。这个库通过这些API封装了std::process::Child
,以支持并发使用。
兼容性说明:目前 libc
库不支持 NetBSD 或 OpenBSD 上的 waitid
,也不支持 older versions of OSX。在某些版本的 OS X 中,可能存在 waitid
函数存在但已损坏的情况。当我们遇到这些问题平台时,可以使用 waitpid
添加一个“尽力而为”的解决方案。如果您遇到此问题,请 提交一个 issue。
示例
use shared_child::SharedChild;
use std::process::Command;
use std::sync::Arc;
// Spawn a child that will just sleep for a long time,
// and put it in an Arc to share between threads.
let mut command = Command::new("python");
command.arg("-c").arg("import time; time.sleep(1000000000)");
let shared_child = SharedChild::spawn(&mut command).unwrap();
let child_arc = Arc::new(shared_child);
// On another thread, wait on the child process.
let child_arc_clone = child_arc.clone();
let thread = std::thread::spawn(move || {
child_arc_clone.wait().unwrap()
});
// While the other thread is waiting, kill the child process.
// This wouldn't be possible with e.g. Arc<Mutex<Child>> from
// the standard library, because the waiting thread would be
// holding the mutex.
child_arc.kill().unwrap();
// Join the waiting thread and get the exit status.
let exit_status = thread.join().unwrap();
assert!(!exit_status.success());
依赖项
~0–8.5MB
~60K SLoC