程序之間的通訊方式

2021-09-25 09:56:14 字數 1133 閱讀 4898

資料傳輸

資源共享

通知事件

程序控制

| 是管道的意思,它的作用就是把前一條命令的輸出作為後一條命令的輸入。如果兩個程序要通訊的話,可以使用這種管道進行通訊,因為 | 沒有名字,所以成為匿名管道,匿名管道一般用於有父子程序關係的程序中 。並且這種通訊方式是單向的,只能把第乙個命令的輸出作為第二個命令的輸入,如果程序之間想要通訊的話,需要建立兩個管道。當然也可以給管道命名,以下就命名乙個名字為test的管道。命名管道不相關的程序也能通訊。

然後用乙個程序給這個管道寫入資料,可以發現如果這個資料沒有被讀出的話,命令就一直停在那裡。只有另外乙個程序把try裡的資料讀走這條命令才會結束。

用另乙個程序來讀取try中的資料。當讀取完以後,上乙個命令也結束了。

總結:

管道的通知機制類似於快取,把乙個程序的資料放在某個快取區域,然後等另外乙個程序去拿。管道通過呼叫pipe函式建立的。

(1)管道是單向傳輸的,即它是半雙工的,這種通訊方式不適合頻繁通訊的程序。

(2)匿名管道只能在具有公共祖先的兩個程序中使用。命名管道可以在兩個不相關的程序之間使用。

(3)但是它比較簡單,能夠保證我們的資料已經被其他程序拿走了。

如果想把程序的資料放在某個記憶體之後不用其他程序來取就讓程序返回的話,可以使用訊息佇列,假如a要給b傳送訊息,只需要把訊息放在訊息佇列中就可以了,b在需要的時候再去對應的訊息佇列中取出來。

總結:

(1)這種方式如果程序a給程序b傳送的資料佔的記憶體比較大,並且通訊頻繁的話,就不太適合了,因為此時傳送資料(拷貝)需要花很長時間讀記憶體。

(2)msgget用於建立乙個新佇列或者是開啟乙個現有佇列。

這種方法可以很好的解決拷貝所消耗的時間。系統載入乙個程序的時候,分配給記憶體的並不是實際物理記憶體,而是虛擬記憶體空間。所以可以讓兩個程序各自拿出一塊虛擬位址空間對映到相同的物理記憶體中,從而實現記憶體共享。

記憶體共享會有多程序競爭記憶體的問題,為此,可以使用訊號量。訊號量本質上是乙個計數器,用來實現程序之間的互斥與同步,比如訊號量初始值是1,a程序來訪問記憶體1時,我們把訊號量的值設為0,當程序b來訪問記憶體1時,發現訊號量是0就知道有程序在訪問,程序b就不會訪問記憶體1了。

5. socket

程序之間的通訊方式

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

程序之間的通訊方式

程序之間的通訊方式有管道 訊息佇列 共享記憶體 訊號量和socket五種方式。管道 來看一條linux的指令 netstat tulnp grep 8080 學過linux命名的估計都懂得這條指令的含義,其中的 就是管道的意思,作用是把前一條命令的輸出作為後一條命令的輸入。在這裡就是把netstat...

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

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