
 
文章目录
- 问题
- 解决方案
- 1. **将 `npc.exe` 启动为独立的进程**
- 2. **修改 `exec.Command` 函数**
- 示例代码
- 解释
- 为什么这样有效
- 注意
 
 
问题
在你当前的代码中,调用 exec.Command("XXX.exe") 启动 XXX.exe 程序时,这个程序是由 Go 程序直接启动的。如果 Go 程序退出并结束运行时,操作系统会终止与该程序相关的所有子进程(包括 XXX.exe)。
这种行为是因为 Go 程序启动 XXX.exe 时,它是作为子进程启动的。如果父进程(Go 程序)退出,操作系统会根据默认行为终止所有子进程。
解决方案
为了避免 Go 程序退出时关闭 XXX.exe,你可以使用如下方法:
1. 将 npc.exe 启动为独立的进程
 
通过在启动时将 npc.exe 作为独立进程启动,可以确保 Go 程序退出时 npc.exe 仍然继续运行。
方法之一是使用 cmd.exe /C start 命令,它将启动一个新的命令窗口并且使 npc.exe 在该窗口中独立运行,Go 程序退出时不会影响它。
2. 修改 exec.Command 函数
 
使用 cmd.exe /C start 命令来启动 XXX.exe,这会启动一个新的进程,避免它受到父进程退出的影响。
示例代码
cmd_x := exec.Command("XXX.exe")
修改为:
cmd_x := exec.Command("cmd", "/C", "start", "XXX.exe")
解释
- exec.Command("cmd", "/C", "start", "XXX.exe"):这个命令通过- cmd.exe启动- XXX.exe,并且通过- /C start命令确保- XXX.exe会在新的命令窗口中运行,这样它就不会被父进程(Go 程序)结束。
- cmd.exe /C start命令确保了- XXX.exe在新的进程中独立运行,即使父进程退出,- XXX.exe仍然会继续执行。
为什么这样有效
- cmd.exe /C start命令创建了一个新的命令提示符窗口,启动的- XXX.exe会在该窗口中运行并且与父进程隔离。
- Go 程序退出时,子进程(即 XXX.exe)的生命周期不再受到影响,因为它是在独立的命令窗口中运行。
注意
- 命令窗口保持打开:cmd.exe /C start会启动一个新的命令窗口,如果不希望窗口保持打开,可以进一步调整启动命令,例如通过"cmd", "/C", "start", "/B", cmd来在后台运行。