2017-12-18 7 views
0

Ich habe über Exec in Go https://gobyexample.com/execing-processes gelesen und versucht, das gleiche mit Gououtines zu tun.Haupt-Thread läuft nicht nach Goroutine Anrufe Exec?

Im folgenden Code versuche ich Go ls ausführen, dann eine Erfolgsmeldung im Hauptthread drucken. Es wird jedoch nur die ls, aber nicht die Erfolgsmeldung gedruckt.

Was ist los?

Danke.

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") 
} 

Hier ist der Ausgang:

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 

Antwort

2

syscall.Exec ersetzt den aktuellen Prozess mit dem einen aufgerufen.

Wenn Sie einen externen Befehl ausgeführt werden soll, während das ursprüngliche Programm am Laufen zu halten, Sie exec.Command

Durch die Art und Weise verwenden müssen, der Link Sie sagt:

Manchmal nur wir wollen Ersetzen Sie den aktuellen Go-Prozess vollständig durch einen anderen (vielleicht nicht Go).

Wenn Sie wirklich das syscall Paket verwenden möchten, können Sie syscall.StartProcess verwenden, das macht einen fork/exec wie auf einem normalen exec gegenüber.