《Go語言四十二章經》第三十章 OS包
《Go語言四十二章經》第三十章 OS包
作者:李驍
30.1 啟動外部命令和程式
os 包有一個 StartProcess 函式可以呼叫或啟動外部系統命令和二進位制可執行檔案;它的第一個引數是要執行的程序,第二個引數用來傳遞選項或引數,第三個引數是含有系統環境基本資訊的結構體。
這個函式返回被啟動程序的 id(pid),或者啟動失敗返回錯誤。
exec 包中也有同樣功能的更簡單的結構體和函式;主要是 exec.Command(name string, arg ...string) 和 Run()。首先需要用系統命令或可執行檔案的名字建立一個 Command 物件,然後用這個物件作為接收器呼叫 Run()。下面的程式(因為是執行 Linux 命令,只能在 Linux 下面執行)演示了它們的使用:
package main import ( "fmt" "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) }
30.2 os/signal 訊號處理
訊號處理在平滑重啟,程序管理的中有著重要實際用途:
package main import ( "fmt" "os" "os/signal" "syscall" "time" ) func main() { go signalListen() for { time.Sleep(10 * time.Second) } } func signalListen() { c := make(chan os.Signal) signal.Notify(c, syscall.SIGUSR2) for { s := <-c //收到訊號後的處理,這裡只是輸出訊號內容,可以做一些更有意思的事 fmt.Println("get signal:", s) } }
關於訊號有關資訊,有興趣建議可以參考《Unix高階程式設計》。os包中其他的功能我就不一一介紹了。
本書《Go語言四十二章經》內容在github上同步地址:https://github.com/ffhelicopter/Go42
本書《Go語言四十二章經》內容在簡書同步地址:https://www.jianshu.com/nb/29056963
雖然本書中例子都經過實際執行,但難免出現錯誤和不足之處,煩請您指出;如有建議也歡迎交流。