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

Download history 90105/week @ 2024-05-01 94562/week @ 2024-05-08 93730/week @ 2024-05-15 89477/week @ 2024-05-22 97896/week @ 2024-05-29 90943/week @ 2024-06-05 90094/week @ 2024-06-12 93553/week @ 2024-06-19 90921/week @ 2024-06-26 82657/week @ 2024-07-03 88698/week @ 2024-07-10 93401/week @ 2024-07-17 101935/week @ 2024-07-24 112237/week @ 2024-07-31 110441/week @ 2024-08-07 96355/week @ 2024-08-14

439,047 monthly downloads
339 个crates中使用 (直接使用19个)

MIT license

29KB
361 代码行数(不包括注释)

shared_child.rs Actions Status crates.io docs.rs

一个用于在多个线程中等待和杀死子进程的库。

标准库中的std::process::Child类型提供了waitkill方法,这些方法接受&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