使用Golang在Windows上启动分离过程

Bap*_*aux 5 windows go

我有一个Golang代码,该代码必须运行一个独立的子进程。

我的实现的Linux版本是syscall.ForkExec这样的。

syscall.ForkExec(my_program, []string{}, nil)
Run Code Online (Sandbox Code Playgroud)

但是我找不到Windows实现。我发现使用的命题START /B

cmd := exec.Command("START", "/B", my_program)
cmd.Start()
Run Code Online (Sandbox Code Playgroud)

不幸的是,START找不到,并且我没有其他使用Golang的解决方案。

icz*_*cza 8

start不是独立的应用程序,它是 Windows 命令行解释器 ( cmd.exe)的(内部)命令(详细信息:命令行参考/开始),因此您需要一个“外壳”来运行该start命令。

cmd.exe/C参数一起使用,并传递start和您的应用程序运行。

就像在这个例子中:

s := []string{"cmd.exe", "/C", "start", `c:\path\to\your\app\myapp.exe`}

cmd := exec.Command(s[0], s[1:]...)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}
Run Code Online (Sandbox Code Playgroud)

或者没有命令切片:

cmd := exec.Command("cmd.exe", "/C", "start", `c:\path\to\your\app\myapp.exe`)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}
Run Code Online (Sandbox Code Playgroud)

如果您不想要启动的应用程序的终端窗口,您也可以像这样传递/b参数start

cmd := exec.Command("cmd.exe", "/C", "start", "/b", `c:\path\to\your\app\myapp.exe`)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}
Run Code Online (Sandbox Code Playgroud)

  • 作为澄清,因为答案中没有提到;即使父程序以非零代码退出,子进程也会保留。(windows下os.exec不提供) (2认同)