废话不多说,直接上代码,简单清晰明了
cmd := exec.Command(execPath)
var rx_r, rx_w, tx_r, tx_w *os.File
rx_r, rx_w, err = os.Pipe()
if err != nil {
return
}
tx_r, tx_w, err = os.Pipe()
if err != nil {
return
}
cmd.SysProcAttr = &syscall.SysProcAttr{} //Setpgid: true
if runtime.GOOS == "linux" {
cmd.ExtraFiles = append(cmd.ExtraFiles, tx_r, rx_w)
}
if runtime.GOOS == "windows" {
cmd.Stdin = tx_r
cmd.Stdout = rx_w
}
err = cmd.Start()
tx_r.Close()
rx_w.Close()
最终rx_r为 “execPath” 启动程序的读取管道,由于windows下设置ExtraFiles 之后start里的实现会有一个判断,最终导致失败,所以windows和linux下的参数改变是不一样的,这个需要特别注意!!!!!
注:runtime.GOOS在“runtime”包中