golang實現子程式通訊
裡用ping程式為例,在main函式中建立ping程式,然後將ping的執行結果透過管道(pipe)傳遞給主程式.主程式讀取結果,然後列印,最後透過主程式傳送系統訊號(syscall.Signal)來結束ping.
cmd1 := exec.Command("ping", "") //建立子程式 ppReader, err := cmd1.StdoutPipe() //建立管道,ppReader為io.ReaderCloser型別 var bufReader = bufio.NewReader(ppReader) //建立帶緩衝的Reader if err != nil { fmt.Printf("create cmd stdoutpipe failed,error:%sn", err) os.Exit(1) } err = cmd1.Start() //啟動cmd1 if err != nil { fmt.Printf("cannot start cmd1,error:%sn", err) os.Exit(1) }
建立協程讀取輸出透過管道傳輸的資料
go func() { var buffer []byte = make([]byte, 4096) for { n, err := bufReader.Read(buffer) //讀取資料到buffer中 if err != nil { if err == io.EOF { //管道關閉後會出現io.EOF錯誤 fmt.Printf("pipi has Closedn") break } else { fmt.Println("Read content failed") } } fmt.Print(string(buffer[:n])) } }()
主程式傳送訊號給子程式,停止cmd1的執行
time.Sleep(10 * time.Second) //讓子程式執行10秒 err = stopProcess(cmd1) // 停止子程式 if err != nil { fmt.Printf("stop child process failed,error:%s", err) os.Exit(1) } cmd1.Wait() //能讓cmd1執行到結束,測試stopProcess是否成功,如果沒有stopProcess,程式和子程式會一直執行 time.Sleep(1 * time.Second) //讓協程能讀取關閉子程式時最後一次傳輸的資料
stopProcess的內容
func stopProcess(cmd *exec.Cmd) error { pro, err := os.FindProcess(cmd.Process.Pid) //透過pid獲取子程式 if err != nil { return err } err = pro.Signal(syscall.SIGINT) //給子程式傳送訊號使之結束 if err != nil { return err } fmt.Printf("結束子程式%s成功n", cmd.Path) return nil}
完整程式碼段
package main import ( "bufio" "fmt" "io" "os" "os/exec" "time" "syscall") func main() { cmd1 := exec.Command("ping", "") ppReader, err := cmd1.StdoutPipe() defer ppReader.Close() var bufReader = bufio.NewReader(ppReader) if err != nil { fmt.Printf("create cmd stdoutpipe failed,error:%sn", err) os.Exit(1) } err = cmd1.Start() if err != nil { fmt.Printf("cannot start cmd1,error:%sn", err) os.Exit(1) } go func() { var buffer []byte = make([]byte, 4096) for { n, err := bufReader.Read(buffer) if err != nil { if err == io.EOF { fmt.Printf("pipi has Closedn") break } else { fmt.Println("Read content failed") } } fmt.Print(string(buffer[:n])) } }() time.Sleep(10 * time.Second) err = stopProcess(cmd1) if err != nil { fmt.Printf("stop child process failed,error:%s", err) os.Exit(1) } cmd1.Wait() time.Sleep(1 * time.Second) } func stopProcess(cmd *exec.Cmd) error { pro, err := os.FindProcess(cmd.Process.Pid) if err != nil { return err } err = pro.Signal(syscall.SIGINT) if err != nil { return err } fmt.Printf("結束子程式%s成功n", cmd.Path) return nil}
執行結果:
PING (180.97.33.107) 56(84) bytes of data.64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=1 ttl=55 time=35.3 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=2 ttl=55 time=34.7 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=3 ttl=55 time=34.2 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=4 ttl=55 time=39.6 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=5 ttl=55 time=34.4 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=6 ttl=55 time=34.2 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=7 ttl=55 time=34.2 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=8 ttl=55 time=34.2 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=9 ttl=55 time=34.2 ms64 bytes from 180.97.33.107 (180.97.33.107): icmp_seq=10 ttl=55 time=34.2 ms 結束子程式/bin/ping成功 --- ping statistics ---10 packets transmitted, 10 received, 0% packet loss, time 9012ms rtt min/avg/max/mdev = 34.206/34.967/39.689/1.632 ms pipi has Closed Process finished with exit code 0
作者:我的飯卡呢
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4729/viewspace-2819950/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java實現TCP通訊程式JavaTCP
- 通過 App Groups 實現程式間通訊APP
- 在 OpenResty 裡實現程式間通訊REST
- 實現不同程式之間的通訊
- 程式間通訊的另類實現
- golang有現成的tcp通訊框架嗎?GolangTCP框架
- 網路通訊2:TCP通訊實現TCP
- 詳解 CmProcess 跨程式通訊的實現
- 利用windows api實現程式通訊(命名管道)WindowsAPI
- 使用AIDL實現程式間的通訊AI
- 匿名管道通訊實現
- java實現UDP通訊JavaUDP
- Android通過繼承Binder類實現多程式通訊Android繼承
- 20 行 Python 程式碼實現加密通訊Python加密
- iOS實現XMPP通訊(二)XMPP程式設計iOS程式設計
- 用NSConnection實現不同程式間的通訊
- 76.最小覆蓋子串 Golang實現Golang
- Day10-微信小程式實戰-交友小程式-實現刪除好友資訊與子父元件間通訊微信小程式元件
- Oracle實時程式通訊Oracle
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- C# 實現socket通訊程式(伺服器端)C#伺服器
- 技術分享| 小程式實現音視訊通話
- Android探索之AIDL實現程式間通訊AndroidAI
- 實現類似QQ的即時通訊程式(十一)
- Android Messenger完全解析 實現程式間通訊AndroidMessenger
- 附例項!實現iframe父窗體與子窗體的通訊
- angular + express 實現websocket通訊AngularExpressWeb
- 利用SQL實現通訊錄SQL
- 呼叫通訊錄實現思路
- 使用Java實現WebSocket通訊JavaWeb
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- C# 通過socket實現UDP 通訊C#UDP
- 實驗八 程式間通訊
- Oracle實時程式通訊(轉)Oracle
- 使用Oracle實現實時通訊(轉)Oracle
- 如何優雅的實現訊息通訊?
- 在VC++ 6.0下利用訊息實現內部程式通訊 (轉)C++
- 如何在微信小程式中實現音視訊通話微信小程式