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

问题描述 投票:0回答:1

我正在阅读关于Go https://gobyexample.com/execing-processes的执行官,并试图使用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
multithreading go exec goroutine
1个回答
2
投票

syscall.Exec用调用的那个替换当前进程。

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

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

有时我们只想用另一个(也许是非Go)替换当前的Go进程。

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

© www.soinside.com 2019 - 2024. All rights reserved.