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
- 實現不同程式之間的通訊
- Day10-微信小程式實戰-交友小程式-實現刪除好友資訊與子父元件間通訊微信小程式元件
- 利用windows api實現程式通訊(命名管道)WindowsAPI
- 詳解 CmProcess 跨程式通訊的實現
- 20 行 Python 程式碼實現加密通訊Python加密
- 76.最小覆蓋子串 Golang實現Golang
- 網路通訊2:TCP通訊實現TCP
- Webview獨立程式並通過AIDL實現資料通訊WebViewAI
- iOS實現XMPP通訊(二)XMPP程式設計iOS程式設計
- 匿名管道通訊實現
- java實現UDP通訊JavaUDP
- C# 實現socket通訊程式(伺服器端)C#伺服器
- 技術分享| 小程式實現音視訊通話
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- 附例項!實現iframe父窗體與子窗體的通訊
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- Oracle實時程式通訊(轉)Oracle
- 實驗八 程式間通訊
- angular + express 實現websocket通訊AngularExpressWeb
- 使用Java實現WebSocket通訊JavaWeb
- JAVASE網路程式設計之TCP實現聊天通訊Java程式設計TCP
- golang實現抓取IP地址的蜘蛛程式Golang
- Golang 併發程式設計(channel實現)Golang程式設計
- Golang併發程式設計程式通訊channel瞭解及簡單使用Golang程式設計
- golang通過mysql語句實現分頁查詢GolangMySql
- 一行程式碼實現Android的跨程式呼叫與通訊行程Android
- 如何優雅的實現訊息通訊?
- laravel 通過 rpc 呼叫 golang 程式LaravelRPCGolang
- php實現共享記憶體程式通訊函式之_shmPHP記憶體函式
- 教你C語言實現通訊錄的詳細程式碼C語言
- 如何在微信小程式中實現音視訊通話微信小程式
- Electron實戰之程式間通訊
- HTTPS通訊的C++實現HTTPC++
- JAVA通訊(三)——實現多人聊天Java
- C# NModbus RTU通訊實現C#