// 上一个例子生成一个外部的进程,当我们需要一个正在运行的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的大多数用例