2017-12-18 4 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가 아닌) Go 프로세스로 완전히 대체하십시오. 당신이 정말로 syscall 패키지를 사용하려면

, 당신은 일반 간부에 반대 포크/간부를 수행 syscall.StartProcess를 사용할 수 있습니다.

관련 문제