os 包有一個(gè) StartProcess
函數(shù)可以調(diào)用或啟動(dòng)外部系統(tǒng)命令和二進(jìn)制可執(zhí)行文件;它的第一個(gè)參數(shù)是要運(yùn)行的進(jìn)程,第二個(gè)參數(shù)用來(lái)傳遞選項(xiàng)或參數(shù),第三個(gè)參數(shù)是含有系統(tǒng)環(huán)境基本信息的結(jié)構(gòu)體。
這個(gè)函數(shù)返回被啟動(dòng)進(jìn)程的 id(pid),或者啟動(dòng)失敗返回錯(cuò)誤。
exec 包中也有同樣功能的更簡(jiǎn)單的結(jié)構(gòu)體和函數(shù);主要是 exec.Command(name string, arg ...string)
和 Run()
。首先需要用系統(tǒng)命令或可執(zhí)行文件的名字創(chuàng)建一個(gè) Command
對(duì)象,然后用這個(gè)對(duì)象作為接收者調(diào)用 Run()
。下面的程序(因?yàn)槭菆?zhí)行 Linux 命令,只能在 Linux 下面運(yùn)行)演示了它們的使用:
示例 13.6 exec.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)
輸出:
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
// 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)
// 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!