程序通訊(二) 無名管道

2021-08-15 13:09:47 字數 924 閱讀 1228

無名管道是父子程序間的通訊。無名的管道建立使用完全是在記憶體中。甚至連有名管道要建立的管道檔案都沒有。

有名管道的管道檔案雖然沒有大小,但好歹磁碟中有個標記,可以被需通訊的程序們看到共同使用。而無名管道的管道完全隱藏在乙個程式的**中,在程序執行時建立銷毀,正是因為這個特點,所以限制了通訊的範圍。

無名管道建立開啟的函式 

int pipe(int fd[2]);

引數其實已經退化為指標了,之所以寫2是為了明顯的表示函式只需要自己定義的fd陣列中的前兩項。

建立成功返回0,失敗返回-1

fd[0]控制讀許可權  

fd[1]控制寫許可權

讀read(fd[0],buff,size);

寫write(fd[1],buff,len);

關閉close(fd[0])  close(fd[1])

值得注意的是,程序通訊為了保證資料的安全完整讀寫,要求半雙工,即父程序只寫或唯讀,子程序對應相應的讀或寫,由於fork出的子程序和其父程序都擁有fd[0]和f[1],因此需要在fork後執行通訊前的第一件事是關閉其中乙個許可權f[0]或f[1]。

純文字還是不夠直觀,簡單的舉個栗子

程序建立子程序,這倆個程序實現這樣一種通訊,即父程序輸入單詞,子程序讀單詞,直到父程序輸入了end,程序結束。

可以看到在父子程序的if else 分別對應的**塊的第一句就是先關閉了非自己應有的許可權。最後才是關閉了自己本身的許可權。

程序間通訊(二) 無名管道 訊號量

一 無名管道 1 無名管道是由系統控制,相對於有名管道而言的。無名管道在使用時產生,不使用時釋放,並不會在系統上留下任何痕跡,所以在 釋放之後你並不知道哪一塊被用過。2 使用限制 和有名管道相比,有名管道可以用於任意兩個程序 包括父子程序 而無名管道因為使用前沒有任何標識,所以只能 用於父子進 程之...

程序通訊 無名管道

管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。管道包括無名管道和有名管道兩種,前者用於父程序和子程序間的通訊,後者可用於執行於同一系統中的任意兩個程序間的通訊。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。管道提供了簡單的流控制機制,程...

linux程序通訊 無名管道

linux無名管道通訊特點無名管道是半雙工的通訊方式,資料只能一方傳送,另一方接收。無名管道只適用於親緣關係的程序通訊。資料的讀出和寫入 乙個程序向管道中寫的內容被管道另一端的程序讀出。寫入的內容每次都新增在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出資料。include include inc...