我生成了一个子进程,
let child = Command::new("./chromedriver")
.spawn()
.expect("Failed To Run Chromedriver");
我想在执行结束时杀死子进程(当主进程终止时).我发现这是一项艰巨的任务,
- 似乎没有简单的方法来注册要在rust中运行的函数.我得用
libc::atexit()
个. - 我不知道如何将参数传递给rust中的C函数指针.所以我得用一个全球性的虚拟机
- 我不知道如何将
std::process::Child
存储为一个全局的静态变量,而不定义它.如果我简单地将static mut CHILD_PROCESS: std::process::Child;
放在文件的开头,它会给出错误free static item without body
.
下面是我设法产生的复杂的解决方案:
static mut CHILD_PROCESS_ID: i32 = 0;
extern "C" fn kill_child() {
unsafe {
let pid: libc::pid_t = CHILD_PROCESS_ID;
libc::kill(pid, libc::SIGKILL);
}
}
fn run_chrome_driver() {
let child = Command::new("./chromedriver")
.spawn()
.expect("Failed To Run Chromedriver");
unsafe {
let id: i32 = child.id().try_into().unwrap();
CHILD_PROCESS_ID = id;
libc::atexit(kill_child);
}
}
我想知道有没有更好的方法,而不使用不安全的防 rust 剂?