2017-12-18 14 views
0

Go https://gobyexample.com/execing-processesでexecについて読んでいて、goroutinesを使って同じことをしようとしました。goroutineがexecの後にメインスレッドが実行されていない?

次のコードでは、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 

答えて

2

syscall.Execは、呼び出されたものと、現在のプロセスを置き換えます。

時々私達はちょうどしたい:

あなたは元のプログラムの実行を維持しながら、外部コマンドを実行したい場合は、あなたがところでexec.Command

を使用する必要がある、あなたが含まれるリンクは言いません現在のGoプロセス を別の(おそらく非Go)プロセスと完全に置き換えます。

あなたが本当にsyscallパッケージを使用する場合は、プレーンなexecのとは対照的に、フォーク/ execのをしているsyscall.StartProcessを使用することができます。

関連する問題