我希望优雅地退出目标进程,而不是直接终止它。进程 A 向进程 B 发送命令,B 收到命令后,完成清理任务然后退出。
- 目标进程不是控制台程序,所以我无法使用
windows.GenerateConsoleCtrlEvent
。 - 目标进程不是 GUI,所以我无法使用
WM_CLOSE
。
Kill
Golang包中的方法实际上os
使用的是TerminateProcess
,这不是我想要的。
更新:
- 我尝试让目标进程监听 stdin。子进程启动后立即结束。这似乎在非交互模式下不起作用。
if runtime.GOOS == "windows" { reader := bufio.NewReader(os.Stdin) if _, err := reader.ReadString('\n'); err != nil { stop() } }
- 我尝试使用
taskkill /t
,但它告诉我目标进程是另一个进程的子进程。所以我调整了父子关系并让父进程调用taskkill /t
,但它仍然返回错误Exit status 128
。这很奇怪。
最后:
最后我使用命名管道解决了这个问题。缺点是它需要目标进程的代码支持。但这对我来说已经足够了,因为目标进程不是第三方进程。