Go by Example: 執行處理序

在先前的範例中,我們探討了 衍生外部處理序。我們需要外部處理序可供執行中的 Go 處理序存取時,就會執行這個動作。有時我們只需要完全將目前的 Go 處理序替換成另一個(可能不是 Go)處理序即可。為此,我們將使用 Go 的傳統 exec 函數實作。

package main
import (
    "os"
    "os/exec"
    "syscall"
)
func main() {

為了示範,我們會執行 ls。Go 需要我們指定要執行的二進位檔的絕對路徑,所以我們會使用 exec.LookPath 來找出它(可能是 /bin/ls)。

    binary, lookErr := exec.LookPath("ls")
    if lookErr != nil {
        panic(lookErr)
    }

Exec 需要以區塊形式指定的引數(而不是字串)。我們會給 ls 幾個常見引數。請注意第一個引數應該是程式名稱。

    args := []string{"ls", "-a", "-l", "-h"}

Exec 也需要一組要使用的 環境變數。我們在此只提供目前的環境。

    env := os.Environ()

以下是實際的 syscall.Exec 呼叫。若此呼叫成功,我們處理序的執行會在此結束,並由 /bin/ls -a -l -h 處理序取代。若有錯誤,我們會取得一個回傳值。

    execErr := syscall.Exec(binary, args, env)
    if execErr != nil {
        panic(execErr)
    }
}

當我們執行我們的程式時,它會被 ls 取代。

$ go run execing-processes.go
total 16
drwxr-xr-x  4 mark 136B Oct 3 16:29 .
drwxr-xr-x 91 mark 3.0K Oct 3 12:50 ..
-rw-r--r--  1 mark 1.3K Oct 3 16:28 execing-processes.go

請注意,Go 沒有提供傳統 Unix fork 函數。通常這不是問題,因為啟動 goroutine、衍生處理序,以及執行處理序涵蓋了 fork 的大多數使用案例。

下一範例:訊號