在等待子进程时杀死它

Luk*_*odt 6 rust

我想执行另一个进程,通常想等到它完成。假设我们在线程 T1 中生成并等待进程:

let child = Command::new("rustc").spawn().unwrap();
child.wait();
Run Code Online (Sandbox Code Playgroud)

现在,如果发生特殊事件(线程 T0 正在等待),我想终止生成的进程:

if let Ok(event) = special_event_notifier.recv() {
    child.kill();
}
Run Code Online (Sandbox Code Playgroud)

但我看不出有什么办法可以做到这一点:两者killwait采用可变引用Child,因此是互斥的。打电话之后wait就没有人可以再参考了child

我找到了wait-timeout箱子,但我想知道是否还有其他方法。

Art*_*mGr 3

显然,您可以自己终止该进程。该Child::id方法为您提供了“操作系统分配的进程标识符”,这应该足够了。

唯一的问题是终止进程是依赖于平台的操作。在 UNIX 上,终止进程是通过Kill函数来处理的:

#![feature(libc)]
extern crate libc;
use std::env::args;
use std::process::Command;
use std::thread::{spawn, sleep};
use std::time::Duration;
use libc::{kill, SIGTERM};

fn main() {
    let mut child = Command::new("/bin/sh").arg("-c").arg("sleep 1; echo foo").spawn().unwrap();
    let child_id = child.id();
    if args().any(|arg| arg == "--kill") {
        spawn(move || {
            sleep(Duration::from_millis(100));
            unsafe {
                kill(child_id as i32, SIGTERM);
            }
        });
    }
    child.wait().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,您可以尝试OpenProcessTerminateProcess函数(可通过kernel32-sys crate 获得)。