C# .NET Core 7.0未使用ShellExecute时Process.Kill的异常行为
这不是BUG,是两种启动方式底层机制差异导致的预期行为
- 当
ShellExecute=false时,底层调用的是Windows原生的CreateProcessAPI。默认情况下,如果父进程A未显式配置进程隔离参数,新启动的子进程B和C会被纳入同一个进程组或继承父进程的作业对象(Job Object)。Windows的作业对象/进程组会将关联进程视为一个整体,当其中一个进程被强制终止(比如Kill操作、任务管理器结束),会触发“终止组内所有进程”的默认规则,因此C会被连带终止。 - 当
ShellExecute=true时,底层是通过Windows Shell服务(而非直接调用CreateProcess)启动进程。Shell在启动子进程时会自动做上下文隔离,将子进程从父进程的作业/进程组中分离,创建独立的进程会话,因此终止B不会影响C的运行。
如果想要在ShellExecute=false的场景下避免这个问题,可以在调用CreateProcess时添加CREATE_NEW_PROCESS_GROUP标志,或者显式创建独立的作业对象来托管每个子进程,实现进程间的隔离。
内容的提问来源于stack exchange,提问作者Shayan Firoozi
相关产品推荐
相关产品推荐

