1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hmz007 6d24f2138b
Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56)
3 years ago
..
src Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
.cargo_vcs_info.json Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
.gitignore Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
.travis.yml Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
Android.bp Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
Cargo.toml Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
Cargo.toml.orig Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
LICENSE Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
METADATA Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
MODULE_LICENSE_MIT Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
OWNERS Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
README.md Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
README.tpl Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
TEST_MAPPING Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
appveyor.yml Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago
cargo2android.json Rockchip Anroid12_SDK 20220721-rkr10 (e1522e56) 3 years ago

README.md

shared_child.rs Travis build Build status crates.io docs.rs

A library for awaiting and killing child processes from multiple threads.

The std::process::Child type in the standard library provides wait and kill methods that take &mut self, making it impossible to kill a child process while another thread is waiting on it. That design works around a race condition in Unix's waitpid function, where a PID might get reused as soon as the wait returns, so a signal sent around the same time could accidentally get delivered to the wrong process.

However with the newer POSIX waitid function, we can wait on a child without freeing its PID for reuse. That makes it safe to send signals concurrently. Windows has actually always supported this, by preventing PID reuse while there are still open handles to a child process. This library wraps std::process::Child for concurrent use, backed by these APIs.

Compatibility note: The libc crate doesn't currently support waitid on NetBSD or OpenBSD, or on older versions of OSX. There might also be some version of OSX where the waitid function exists but is broken. We can add a "best effort" workaround using waitpid for these platforms as we run into them. Please file an issue if you hit this.

Example

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());