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");
}