概念簡介
在前麵的例子中,我們了解了生成外部進程](../spawning-processes/)
的知識,當我們需要訪問外部進程時需要這樣做,但是有時候,我們隻想
用其他的(也許是非 Go 程序)來完全替代當前的 Go 進程。這時候,我們
可以使用經典的 exec
方法的 Go 實現。
例程代碼
package main
import "syscall"
import "os"
import "os/exec"
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` 同樣需要使用[環境變量](environment-variables.html)。
// 這裏我們僅提供當前的環境變量。
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` 函數。通常這不
# 是個問題,因為運行 Go 協程,生成進程和執行進程覆蓋了
# fork 的大多數使用場景。
課程導航
學習上一篇:Go語言教程:生成進程 學習下一篇:Go語言教程:信號
相關資料
本例程github源代碼:https://github.com/xg-wang/gobyexample/tree/master/examples/execing-processes