主线程未在Goroutine调用Exec之后运行



我正在阅读有关exec的https://gobyexample.com/execing-processes,并尝试使用Goroutines进行相同的操作。

在以下代码中,我正在尝试进行运行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

syscall.Exec用调用一个过程代替当前过程。

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

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

有时我们只想完全替换当前的GO过程 与另一个(也许是非go)。

如果您真的想使用syscall软件包,则可以使用fork/exec而不是普通exec的syscall.StartProcess

最新更新