Go 示例: 执行进程

在前面的示例中,我们了解了生成外部进程。当我们需要一个运行中的 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 的大多数用例。

下一个示例:信号.