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 | use win32job::Job; |