程序之間究竟有哪些通訊 方式?如何通訊?

2022-03-15 01:08:54 字數 3547 閱讀 4179

1、管道

我們來看⼀一條 linux 的語句句

netstat -tulnp | grep 8080

學過 linux 命名的估計都懂這條語句句的含義,其中」|「是管道的意思,它的作⽤用就是把前⼀一條命令的輸出

作為後⼀一條命令的輸⼊入。在這⾥裡里就是把 netstat -tulnp 的輸出結果作為 grep 8080 這條命令的輸⼊入。如

果兩個程序要進⾏行行通訊的話,就可以⽤用這種管道來進⾏行行通訊了了,並且我們可以知道這條豎線是沒有名字

的,所以我們把這種通訊⽅方式稱之為匿匿名管道。

並且這種通訊⽅方式是單向的,只能把第⼀乙個命令的輸出作為第⼆二個命令的輸⼊入,如果程序之間想要互相

通訊的話,那麼需要建立兩個管道。

居然有匿匿名管道,那也意味著有命名管道,下⾯面我們來建立⼀乙個命名管道。

makefifo test

這條命令建立了了⼀乙個名字為 test 的命名管道。

接下來我們⽤用⼀乙個程序向這個管道⾥裡里⾯面寫資料,然後有另外⼀乙個程序把⾥裡里⾯面的資料讀出來。

echo "this is a pipe">test

這個時候管道的內容沒有被讀出的話,那麼這個命令就會⼀一直停在這⾥裡里,只有當另外⼀乙個程序把 test ⾥裡里

⾯面的內容讀出來的時候這條命令才會結束。接下來我們⽤用另外⼀乙個程序來讀取

cat < test//讀資料

我們可以看到,test ⾥裡里⾯面的資料被讀取出來了了。上⼀一條命令也執⾏行行結束了了。

從上⾯面的例例⼦子可以看出,管道的通知機制類似於快取,就像⼀乙個程序把資料放在某個快取區域,然後等

著另外⼀乙個程序去拿,並且是管道是單向傳輸的。

這種通訊⽅方式有什什麼缺點呢?顯然,這種通訊⽅方式效率低下,你看,a 程序給 b 程序傳輸資料,只能等

待 b 程序取了了資料之後 a 程序才能返回。

所以管道不不適合頻繁通訊的程序。當然,他也有它的優點,例例如⽐比較簡單,能夠保證我們的資料已經真

的被其他程序拿⾛走了了。我們平時⽤用 linux 的時候,也算是經常⽤用。

2、訊息佇列列

那我們能不不能把程序的資料放在某個記憶體之後就⻢馬上讓程序返回呢?⽆無需等待其他程序來取就返回呢?

答是可以的,我們可以⽤用訊息佇列列的通訊模式來解決這個問題,例例如 a 程序要給 b 程序傳送訊息,只需

要把訊息放在對應的訊息佇列列⾥裡里就⾏行行了了,b 程序需要的時候再去對應的 訊息佇列列⾥裡里取出來。同理理,b 進

程要個 a 程序傳送訊息也是⼀一樣。這種通訊⽅方式也類似於快取吧。

netstat -tulnp | grep 8080

mkfifo test

echo "this is a pipe" > test // 寫資料

cat < test // 讀資料

這種通訊⽅方式有缺點嗎?答是有的,如果 a 程序傳送的資料佔的記憶體⽐比較⼤大,並且兩個程序之間的通訊

特別頻繁的話,訊息佇列列模型就不不⼤大適合了了。因為 a 傳送的資料很⼤大的話,意味傳送訊息(拷⻉貝)這個

過程需要花很多時間來讀記憶體。

哪有沒有什什麼解決⽅方案呢?答是有的,請繼續往下看。

3、共享記憶體

共享記憶體這個通訊⽅方式就可以很好著解決拷⻉貝所消耗的時間了了。

這個可能有⼈人會問了了,每個程序不不是有⾃自⼰己的獨⽴立記憶體嗎?兩個程序怎麼就可以共享⼀一塊記憶體了了?

我們都知道,系統載入⼀乙個程序的時候,分配給程序的記憶體並不不是實際物理理記憶體,⽽而是虛擬記憶體空間。

那麼我們可以讓兩個程序各⾃自拿出⼀一塊虛擬位址空間來,然後對映到相同的物理理記憶體中,這樣,兩個進

程雖然有著獨⽴立的虛擬記憶體空間,但有⼀一部分卻是對映到相同的物理理記憶體,這就完成了了記憶體共享機制

了了。

4、訊號量量

共享記憶體最⼤大的問題是什什麼?沒錯,就是多程序競爭記憶體的問題,就像類似於我們平時說的執行緒安全問

題。如何解決這個問題?這個時候我們的訊號量量就上場了了。

訊號量量的本質就是⼀乙個計數器器,⽤用來實現程序之間的互斥與同步。例例如訊號量量的初始值是 1,然後 a 進

程來訪問記憶體1的時候,我們就把訊號量量的值設為 0,然後程序b 也要來訪問記憶體1的時候,看到訊號量量

的值為 0 就知道已經有程序在訪問記憶體1了了,這個時候程序 b 就會訪問不不了了記憶體1。所以說,訊號量量也是

程序之間的⼀一種通訊⽅方式。

5、socket

上⾯面我們說的共享記憶體、管道、訊號量量、訊息佇列列,他們都是多個程序在⼀一台主機之間的通訊,那兩個

相隔⼏幾千⾥裡里的程序能夠進⾏行行通訊嗎?

答是必須的,這個時候 socket 這傢伙就派上⽤用場了了,例例如我們平時通過瀏覽器器發起⼀乙個 http 請求,然

後伺服器器給你返回對應的資料,這種就是採⽤用 socket 的通訊⽅方式了了。

總結

所以,程序之間的通訊⽅方式有:

1、管道

2、訊息佇列列

3、共享記憶體

4、訊號量量

5、socket

Linux 程序之間通訊都有哪些方式

通訊手段 簡介管道 pipe 即有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊 訊號 signal 訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程...

程序之間 執行緒之間的通訊方式

1 程序間的8中通訊方式 1 無名管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。2 2 高階管道 popen 將另乙個程式當做乙個新的程序在當前程式程序中啟動,則它算是當前程式的子程序,這種方式我們成為高階管道方...

程序之間的通訊方式

1 管道 pipe 管道可用於具有親緣關係程序間的通訊,允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊。2 命名管道 name pipe 命名管道克服了沒有名字的限制,因此,除了具有管道所擁有的功能外,它還允許無親緣關係程序間同通訊。命名管道在檔案系統中有對應的檔名。命名管道通過命令mkfif...