抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

この素晴らしい世界に祝福を!

Rust 下通过配置 Job Object 实现在主进程退出时自动清理创建的子进程

之前写 Tauri 应用(没错就是BiliTools)时,需要在后台挂个 aria2c 实现多线程下载

然后发现很尴尬这玩意不会跟着应用退出而退出(理所当然)

本来想的是写一个结构体,存 Child,然后监听窗口关闭事件 tauri::WindowEvent::Destroyed,调用函数把进程杀了

这种方法能用是能用吧,但是如果 Panic,非正常关闭,应用更新什么的就会比较麻烦

不如找个一劳永逸的方法,就不用到处设 hook 监听退出了

WinAPI 下有个叫 Job Object / 作业对象 的东西,可以关联进程,从而实现终止与作业关联的所有进程

Rust 中有两种方式实现它:

  • Crate winapi 自己用 winapi 写,工程量比较大
  • Crate win32job GitHub 上有人封装了作业对象的 api,可以直接用

下面是 win32job 的示例

main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use win32job::Job;
use std::process::Command;

fn main() -> Result<(), Box<dyn std::error::Error>> {
let job = Job::create()?;
let mut info = job.query_extended_limit_info()?;
info.limit_kill_on_job_close(); // 确保当 Job Object 的句柄被关闭时,所有关联的进程都会被终止
job.set_extended_limit_info(&mut info)?;
job.assign_current_process()?; // 让 Job Object 关联进程

Command::new("aria2c.exe")
.spawn()?;

// job 被 drop 或者主进程退出时,aria2c 就会被杀死

Ok(())
}

评论