Rust 如果我的应用程序恐慌,如何确保生成的子进程被杀死?

Rust 如果我的应用程序恐慌,如何确保生成的子进程被杀死?,rust,child-process,zombie-process,Rust,Child Process,Zombie Process,我正在编写一个启动守护进程并对其进行测试的小测试,例如: let server = Command::new("target/debug/server").spawn(); // do some tests server.kill(); 考试失败的典型方式是惊慌失措。不幸的是,这意味着kill()永远不会被调用,测试套件的重复运行也会失败,因为端口被仍在运行的旧进程占用 有没有类似陷阱的功能,我可以用来确保孩子被杀 您可以将可能惊慌失措的代码放入一个闭包中,并将该闭包交给catch\u p

我正在编写一个启动守护进程并对其进行测试的小测试,例如:

let server = Command::new("target/debug/server").spawn();

// do some tests

server.kill();
考试失败的典型方式是惊慌失措。不幸的是,这意味着kill()永远不会被调用,测试套件的重复运行也会失败,因为端口被仍在运行的旧进程占用


有没有类似陷阱的功能,我可以用来确保孩子被杀

您可以将可能惊慌失措的代码放入一个闭包中,并将该闭包交给
catch\u panic
的作用方式与
scoped
spawn
ed线程在
join
ing上的作用方式相同。它返回一个带有
Ok(ClosureRetVal)
Err(Box

的结果。您可以使用标准RAII模式确保在离开给定范围时终止子线程。如果您只想在恐慌时终止子线程,您可以插入一个复选框


如果线程崩溃,Drop实现是否保证运行?我想是的,除非崩溃是在析构函数中启动的,这在Rust中是一个坏主意,因为各种原因。有一些文档说明了在中展开过程是如何发生的。谢谢,这大概就是我最后要做的。虽然现在我一次就有了它,但是出现了rs是不可能被执行的。
let res = std::thread::catch_panic(|| {
    panic!("blub: {}", 35);
});
if let Err(err) = res {
    let msg: String = *err.downcast().unwrap();
    println!("{}", msg);
}
use std::process::{Command,Child};

struct ChildGuard(Child);

impl Drop for ChildGuard {
    fn drop(&mut self) {
        // You can check std::thread::panicking() here
        match self.0.kill() {
            Err(e) => println!("Could not kill child process: {}", e),
            Ok(_) => println!("Successfully killed child process"),
        }
    }
}

fn main() {
    let child = Command::new("/bin/cat").spawn().unwrap();
    let _guard = ChildGuard(child);

    panic!("Main thread panicking");
}