瀏覽代碼

翻译13.6

dake 10 年之前
父節點
當前提交
725f2b5c1a
共有 3 個文件被更改,包括 90 次插入1 次删除
  1. 88 1
      eBook/13.6.md
  2. 1 0
      eBook/13.7.md
  3. 1 0
      eBook/directory.md

+ 88 - 1
eBook/13.6.md

@@ -1 +1,88 @@
-# 13.6 启动外部命令和程序
+# 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] []  <nil> <nil> <nil> 0xf840000210 <nil> 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)

+ 1 - 0
eBook/13.7.md

@@ -0,0 +1 @@
+# 13.7 Go 中的单元测试和基准测试

+ 1 - 0
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章:网络、模版与网页应用