go語言快速入門 IPC之管道通訊 8

2021-08-31 01:43:39 字數 2274 閱讀 4717

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

熟悉unix/c程式設計的應該對ipc也非常的熟悉,多程序之間的通訊主要的手段有管道/訊號量/共享記憶體/socket等,而管道作為父子程序間進行少量資料傳遞的有效手段也得到了廣泛的應用,在這篇文章中我們來看一下go語言中如何使用管道進行程序進行通訊。

在linux下,管道被非常廣泛地使用,一般在程式設計中我們實現了popen等的應用即可提供管道功能。而在命令列中使用地也非常多,|就是最為典型的管道的應用例子。shell會為|符號兩側的命令各建立乙個指令碼,將左側的輸出管道與右側的輸入管道進行連線,可以進行單向管道通訊。

比如我們使用go env來確認go語言的環境變數,然後使用grep從中確認出goroot環境變數的值一般會如下這樣做

[root@liumiaocn goprj]# go env |grep goroot

goroot="/usr/local/go"[root@liumiaocn goprj]#

實現的過程其實go env會啟動乙個程序, 而grep命令也會產生乙個程序,grep的程序會在go env的標準輸出中進行檢索goroot的行的資訊然後顯示出來,而負責這兩個程序間的通訊的正是管道。

在c語言中,我們需要父程序中進行fork以及對父程序的基本資訊進行處理,同時初期化連線的管道資訊從而實現管道通訊。接下來,我們來看一下在go語言中是如何實現的

為了方便演示,我們使用標準庫os中的api以呼叫作業系統的命令並在此基礎上建立用於通訊的管道

[root@liumiaocn goprj]# cat basic-ipc-pipe.go

package mainimport

"fmt"

import

"os/exec"

[root@liumiaocn goprj]# go run basic-ipc-pipe.gostandard output of go env command: goarch="amd64"gobin=""goexe=""gohostarch="amd64"gohostos="linux"goos="linux"gopath=""gorace=""goroot="/usr/local/go"gotooldir="/usr/local/go/pkg/tool/linux_amd64"cc="gcc"gogccflags="-fpic -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build142715013=/tmp/go-build -gno-record-gcc-switches"cxx="g++"cgo_enabled="1"[root@liumiaocn goprj]#
通過呼叫exec.start啟動乙個程序,通過stdoutpipe將此呼叫的輸出管道也建立了出來,在這裡,我們讀取了此輸出的資訊,確實是go env命令的標準輸出,接下來要做的事情就是將此輸出的管道與grep命令的程序進行連線了。我們將上面的**進一步充實:

[root@liumiaocn goprj]# cat basic-ipc-pipe.go

package mainimport

"fmt"

import

"os/exec"

import

"bufio"

import

"bytes"

var buf_result bytes.buffer        cmd_grep.stdout = &buf_result        //grep_error := cmd_grep.start()

內容非常簡單,無需過多解釋,唯一需要注意的就是上乙個例子中為了確認中間資訊,讀出管道的資訊,但是此處讀完了,輸入管道就讀不到了,所以注釋掉了才能正常執行

[root@liumiaocn goprj]# go run basic-ipc-pipe.go

goroot="/usr/local/go"[root@liumiaocn goprj]#

從這裡可以看出與go env |grep goroot是一樣的結果。

本文通過模擬非常簡單的管道在go中實現的例子,解釋了go語言中匿名管道的使用方式,當然和unix/c一樣,go也支援命名管道,通過os.pipe()即可輕鬆實現,基本原理均類似,在此不再贅述。

給我老師的人工智慧教程打call!

go語言快速入門 IPC之管道通訊 8

熟悉unix c程式設計的應該對ipc也非常的熟悉,多程序之間的通訊主要的手段有管道 訊號量 共享記憶體 socket等,而管道作為父子程序間進行少量資料傳遞的有效手段也得到了廣泛的應用,在這篇文章中我們來看一下go語言中如何使用管道進行程序進行通訊。在linux下,管道被非常廣泛地使用,一般在程式...

go語言快速入門 一

1.使用var宣告 go語言中使用var宣告變數 var name type expressiontype和expression可以省略乙個,如 package main import fmt func main 結果 10 0 102.多變數宣告 var a,b int var c,d 1,b v...

Go語言入門之 基本了解

2007年,受夠了c 煎熬的google首席軟體工程師rob pike糾集robert griesemer和ken thompson兩位牛人,決定創造一種新語言來取代c 這就是golang。出現在21世紀的go語言,雖然不能如願對c 取而代之,但是其近c的執行效能和近解析型語言的開發效率以及近乎於完...