Go基礎編程實踐(八)—— 系統編程

捕捉信號

// 運行此程序,控制檯將打印"Waiting for signal"
// 按Ctrl + C 發送信號以關閉程序,將發生中斷
// 隨後控制檯依次打印"Signal .."、"Exiting..."
package main

import (
    "os"
    "os/signal"
    "syscall"
    "fmt"
)

func main() {
    // 緩衝通道捕捉信號
    signals := make(chan os.Signal, 1)
    done := make(chan bool)
    // Notify將輸入信號轉發到channel
    signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        sig := <- signals
        fmt.Println(sig)
        fmt.Println("Signal captured and processed...")
        done <- true
    }()
    fmt.Println("Waiting for signal")
    <- done
    fmt.Println("Exiting the application...")
}

運行子進程

// 在Go程序中運行其餘進程
package main

import (
    "os/exec"
    "fmt"
)

func main() {
    // Command接收兩個參數:命令、命令參數
   // lsCommand := exec.Command("ls", "-a")
    lsCommand := exec.Command("ls")
    // Output執行命令並返回標準輸出的切片。
    output, _ := lsCommand.Output()
    //Run函數阻塞進程直到lsCommand執行完畢,與之相似到Start函數不阻塞
    lsCommand.Run()
    // 獲取進程ID
    fmt.Println(lsCommand.Process.Pid)
    // 獲取ls命令結果
    fmt.Println(string(output))
}

處理命令行參數

package main

import (
    "os"
    "fmt"
)

func main() {
    // os.Args的第一個元素是可執行文件路徑,因此獲取參數從下標1開始
    realArgs := os.Args[1:]
    if len(realArgs) == 0 {
        fmt.Println("Please pass an argument.")
        return
    }
    if realArgs[0] == "a" {
        writeHelloWorld()
    } else if realArgs[0] == "b" {
        writeHelloMars()
    } else {
        fmt.Println("Please pass a valid argument.")
    }
}

func writeHelloWorld() {
    fmt.Println("Hello, World!")
}

func writeHelloMars() {
    fmt.Println("Hello, Mars!")
}
// 執行"go run main.go a"將輸出"Hello, World!"
// 執行"go run main.go b"將輸出"Hello, Mars!"
相關文章
相關標籤/搜索