繁体   English   中英

goroutine调用exec后主线程未运行?

[英]Main thread not running after goroutine calls exec?

我在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

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

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

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

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

如果您确实要使用syscall程序包,则可以使用syscall.StartProcess来执行fork / exec而不是普通exec。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM