作業系統 程序 程序間通訊 管道

2021-10-09 01:47:39 字數 1797 閱讀 7414

linux中的「|」豎線

$ ps auxf| grep mysql
上面命令列裡的|豎線就是乙個管道,它的功能是將乙個命令(ps auxf)的輸出,作為後乙個命令(grep mysql)的輸入,從這功能描述,可以看出管道傳輸資料是單向的。

如果想互相通訊,我們需要建立兩個管道才行。

同時,|這種管道是沒有名字,表示匿名管道,用完了就銷毀。

所以相應地,管道還有另外乙個型別是命名管道,也叫做fifo,因為資料是先進先出的傳輸方式。

在使用命名管道前,先需要通過mkfifo命令來建立,並且指定管道名字:

$ mkfifo mypipe

//mypipe就是管道的名字

基於linux一切皆檔案的理念,所以管道也是檔案的方式存在,我們可以用ls檢視一下,這個檔案的型別是p,也就是pipe(管道)的意思:

$ ls -l

pew-r--r--

.1 root root 0 aug 1102:

45 mypipe

接下來,我們往mypipe這個管道寫入資料:

$ echo "hello"

> mypipe //將資料寫進管道

//停住了...

你會發現,操作後,就停在這了,這是因為管道裡內容沒有被讀取,只有當管道裡的資料被讀取後,命令才可以正常退出???

於是我們在另乙個終端執行另外乙個命令來讀取這個管道裡的資料:

$ cat   <   mypipe     //讀取管道裡資料

hello

可以看到,管道裡的內容被讀取出來了,並列印在了終端上,另外乙個方面,echo那個命令也正常退出了。

我們可以看出,管道這種通訊方式效率低,不適合程序間頻繁地交換資料。當然它的好處自然就是簡單哈哈哈。同時我們也很容易得出管道裡的資料已經被另外乙個程序讀取了!!!。完成了程序間的通訊!!!

那麼,上面講了命名管道,下面講講匿名管道的建立,需要通過下面這個命令呼叫:

int

pipe

(int fd[2]

)

這裡表示建立乙個匿名管道,並返回了兩個描述符,乙個是管道的讀取端描述符fd[0],另乙個是管道的寫入端描述符fd[1]。注意,這個匿名管道是特殊檔案,只存在記憶體,不存在檔案系統中。

其實,所謂的管道,就是核心裡面的一串快取。

從管道的一端寫入資料,實際上是快取在核心中的,另一端的讀取,也就是從核心中讀取這段資料。

另外,管道傳輸的資料是無格式的流且大小受限。

但是了解到這,我們不能忘了主題!!!程序間的通訊!!!

所以我們這時要會質問:這兩個描述符都是在乙個程序裡面,並沒有起到程序間通訊的作用,怎麼樣才能使得管道是跨過兩個程序的呢???

我們可以使用fork建立子程序,woc建立的子程序會複製父程序的檔案描述符,這樣就做到了兩個程序各有兩個(fd[0]與fd[1]),兩個程序就可以通過各自的fd寫入和讀取同乙個管道檔案!!!實現跨程序通訊了。

但是,管道只能一端讀取另一端寫入,所以上面這種模式容易造成混亂,因為父程序和子程序都可以同時寫入,也可以同時讀取。那麼為了避免這種情況,通常的做法是:

程序間通訊 管道

include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...

程序間通訊 管道

原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...

程序間通訊 管道

程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...