利用 Job 内核对象实现父进程关闭时自动结束所有子进程
投稿工具的压制功能一直来都有一个问题:如果主进程被强行结束了(例如利用任务管理器),那么创建的 ffmpeg 压制进程仍然会继续运行。
因为 ffmpeg 是以二进制的方式部署的,因此不存在修改它的代码,自己和主进程建立 IPC 监控的方式。
至于采用远线程注入的方式来强行 HACK,我一直对这种无视客观规律的霸道方式都不太感冒,毕竟我们又不是做安全软件。
所以我想到了曾经在 Windows 核心编程中看到的一个方法:使用 Job 内核对象。
核心方法总结起来就是一句话:将 ffmpeg 压制进程加入到一个 Job 对象中,利用 Job 对象的 Kill-On-Close 特性,在 Job 内核对象被释放时,Job 内的所有进程都会被系统结束。
于是我写了一个 demo snippet,解决了几个坑之后验证了我的想法。
1 |
|
最终的产品代码思路是完全一样的,当然代码不可能像上面这样随意。
这里有两个比较隐蔽的坑(MSDN 上不一定能看到)需要注意一下: