71-execing-process

// 上一个例子生成一个外部的进程,当我们需要一个正在运行的Go进程可访问的外部进程时,会这样做
// 有时只想用另一个(也许是非Go进程)替换当前的Go进程。为此,将使用Go的经典exec函数来实现

package main

import (
	"os"
	"os/exec"
	"syscall"
)

func main() {
	// 下面的示例将执行ls命令
	// Go需要一个想要执行的二进制文件的绝对路径
	// 使用exec.LookPath函数来找打它
	binary, lookErr := exec.LookPath("ls")
	if lookErr != nil {
		panic(lookErr)
	}

	// Exec需要切片形式的参数(与一个大字符串相对应)
	// 第一个参数应该是程序名称
	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)
	}
}

// 请注意,Go不提供经典的Unix fork函数
// 通常这不是问题因为启动goroutine产生进程和exec'ing进程涵盖了fork的大多数用例
上次修改: 10 January 2020