使用Golang在Windows上启动一个分离的进程

时间:2018-05-25 14:22:30

标签: windows go

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

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

syscall.ForkExec(my_program, []string{}, nil)

但我找不到Windows实现。我找到了一个使用START /B的命题。

cmd := exec.Command("START", "/B", my_program)
cmd.Start()

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

2 个答案:

答案 0 :(得分:4)

start不是一个独立的应用程序,它是Windows命令行解释器(cmd.exe)的一个(内部)命令(详情:Command line reference / Start),所以你需要a" shell"运行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)
}

或者没有命令切片:

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

如果您不想要启动的应用程序的终端窗口,您也可以将/b param传递给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)
}

答案 1 :(得分:0)

我不清楚你所说的分离是什么意思。如果你的意思是从某种意义上说,“不要 等待程序完成”,你不需要一个外壳:

package main
import "os/exec"

func main() {
   exec.Command("firefox", "google.com/search?q=golang").Start()
}

https://golang.org/pkg/os/exec#Cmd.Start