diff --git a/eBook/13.6.md b/eBook/13.6.md index 14d6ab5..8787d93 100644 --- a/eBook/13.6.md +++ b/eBook/13.6.md @@ -1 +1,88 @@ -# 13.6 启动外部命令和程序 \ No newline at end of file +# 13.6 启动外部命令和程序 + +os 包有一个 `StartProcess` 函数可以调用或启动外部系统命令和二进制可执行文件;它的第一个参数是要运行的进程,第二个参数用来传递选项或参数,第三个参数是含有系统环境基本信息的结构体。 + +这个函数返回被启动进程的 id(pid),或者启动失败返回错误。 + +exec 包中也有同样功能的更简单的结构体和函数;主要是 `exec.Command(name string, arg ...string)` 和 `Run()`。首先需要用系统命令或可执行文件的名字创建一个 `Command` 对象,然后用这个对象作为接收者调用 `Run()`。下面的程序(因为是执行 Linux 命令,只能在 Linux 下面运行)演示了它们的使用: + +示例 13.6 [exec.go](examples/chapter_13/exec.go): + +```go +// exec.go +package main +import ( + "fmt" + "os/exec" + "os" +) + +func main() { +// 1) os.StartProcess // +/*********************/ +/* Linux: */ +env := os.Environ() +procAttr := &os.ProcAttr{ + Env: env, + Files: []*os.File{ + os.Stdin, + os.Stdout, + os.Stderr, + }, + } +// 1st example: list files +pid, err := os.StartProcess("/bin/ls", []string{"ls", "-l"}, procAttr) +if err != nil { + fmt.Printf("Error %v starting process!", err) // + os.Exit(1) +} +fmt.Printf("The process id is %v", pid) +``` + +输出: + +``` go +The process id is &{2054 0}total 2056 +-rwxr-xr-x 1 ivo ivo 1157555 2011-07-04 16:48 Mieken_exec +-rw-r--r-- 1 ivo ivo 2124 2011-07-04 16:48 Mieken_exec.go +-rw-r--r-- 1 ivo ivo 18528 2011-07-04 16:48 Mieken_exec_go_.6 +-rwxr-xr-x 1 ivo ivo 913920 2011-06-03 16:13 panic.exe +-rw-r--r-- 1 ivo ivo 180 2011-04-11 20:39 panic.go +``` + +```go +// 2nd example: show all processes +pid, err = os.StartProcess("/bin/ps", []string{"-e", "-opid,ppid,comm"}, procAttr) +if err != nil { + fmt.Printf("Error %v starting process!", err) // + os.Exit(1) +} +fmt.Printf("The process id is %v", pid) + +``` + +```go +// 2) exec.Run // +/***************/ +// Linux: OK, but not for ls ? +// cmd := exec.Command("ls", "-l") // no error, but doesn't show anything ? +// cmd := exec.Command("ls") // no error, but doesn't show anything ? + cmd := exec.Command("gedit") // this opens a gedit-window + err = cmd.Run() + if err != nil { + fmt.Printf("Error %v executing command!", err) + os.Exit(1) + } + fmt.Printf("The command is %v", cmd) +// The command is &{/bin/ls [ls -l] [] 0xf840000210 true [0xf84000ea50 0xf84000e9f0 0xf84000e9c0] [0xf84000ea50 0xf84000e9f0 0xf84000e9c0] [] [] 0xf8400128c0} +} +// in Windows: uitvoering: Error fork/exec /bin/ls: The system cannot find the path specified. starting process! + +``` + + +## 链接 + +- [目录](directory.md) +- 上一节:[一种用闭包处理错误的模式](13.5.md) +- 下一节:[Go 中的单元测试和基准测试](13.7.md) \ No newline at end of file diff --git a/eBook/13.7.md b/eBook/13.7.md new file mode 100644 index 0000000..df23f94 --- /dev/null +++ b/eBook/13.7.md @@ -0,0 +1 @@ +# 13.7 Go 中的单元测试和基准测试 \ No newline at end of file diff --git a/eBook/directory.md b/eBook/directory.md index 77c3416..74f91ee 100644 --- a/eBook/directory.md +++ b/eBook/directory.md @@ -131,6 +131,7 @@ - 13.4 [自定义包中的错误处理和 panicking](13.4.md) - 13.5 [一种用闭包处理错误的模式](13.5.md) - 13.6 [启动外部命令和程序](13.6.md) + - 13.7 [Go 中的单元测试和基准测试](13.7.md) - 第14章:goroutine 与 channel - 第15章:网络、模版与网页应用