goroutine调用exec后主线程没有运行?

时间:2017-12-18 00:06:38

标签: multithreading go exec goroutine

我正在阅读Go https://gobyexample.com/execing-processes中的exec,并试图使用goroutines做同样的事情。

在下面的代码中,我试图让Go运行ls,然后在主线程中打印成功消息。但是,它只打印ls,而不是成功消息。

发生了什么?

感谢。

package main

import "syscall"
import "os"
import "os/exec"
import "fmt"

func main() {
    p := fmt.Println
    done := make(chan bool)
    binary, lookErr := exec.LookPath("ls")
    if lookErr != nil {
        panic(lookErr)
    }

    args := []string{"ls", "-a", "-l", "-h"}

    env := os.Environ()

    go func() {
        execErr := syscall.Exec(binary, args, env)
        if execErr != nil {
            panic(execErr)
        }
        done <- true
    }()

    <-done

    p("Done with exec")
}

这是输出:

Valeriys-MacBook-Pro:test valeriy$ go run test.go 
total 8
drwxr-xr-x  3 valeriy  staff    96B Dec 17 15:46 .
drwxr-xr-x  8 valeriy  staff   256B Dec 17 00:06 ..
-rw-r--r--  1 valeriy  staff   433B Dec 17 15:38 test.go

1 个答案:

答案 0 :(得分:2)

syscall.Exec将当前进程替换为所调用的进程。

如果要在保持原始程序运行的同时运行外部命令,则需要使用exec.Command

顺便说一句,你所包含的链接确实说:

  

有时我们只想完全取代当前的Go流程   与另一个(也许是非Go)一个。

如果你真的想使用syscall包,你可以使用syscall.StartProcess执行fork / exec而不是普通的exec。