Linux 程序間通訊的幾種方式總結

2021-09-24 15:29:32 字數 3000 閱讀 2145

介紹與總結以下幾種程序間通訊方式:

管道:system v程序間通訊

半雙工通訊(可選方向的單向傳輸)。

本質核心中的一塊緩衝區。

實現程序間通訊的原理:讓多個程序通過訪問到相同的緩衝區來實現通訊。管道實現通訊使用的是系統呼叫的io介面(這也遵循了一切皆檔案的思想)。

匿名管道只能用於具有親緣關係的程序間通訊(子程序通過複製父程序的檔案描述符作為管道的操作控制代碼)

匿名管道的簡單實現

首先我們要知道乙個程序建立匿名管道,作業系統在核心中建立一塊緩衝區,並返回兩個檔案描述符作為管道的操作控制代碼(乙個用於讀,乙個用於寫,方向的選擇權交給使用者),但是這個緩衝區在核心中沒有標識,其它的程序找不到它,這也就是為什麼匿名管道只能用於具有親緣關係的程序間通訊的原因了。這一步通過介面int pipe(int pipefd[2])來實現。

然後建立乙個子程序,複製父程序的檔案描述符,父程序完成寫入操作,子程序程序讀取操作,**如下:

執行結果:

接下來我們通過**實現乙個 ls | grep make。首先建立兩個子程序,乙個執行ls,另乙個執行grep make,將ls這個程序的標準輸出重定向到管道寫入端,將grep這個程序的標準輸入重定向到管道的讀取端即可。

**如下:

執行結果:

可以看到我們通過**實現的ls | grep make 與直接輸入命令得到的結果一致。

命名管道可以用於同一主機上的任意程序間通訊。其生命週期隨程序。

管道自帶同步與互斥(管道的讀寫資料大小不超過pipe_buf時(4096),讀寫操作保證原子性即不會被打斷)

同步:保證對臨界資源訪問的時許合理性

互斥:保證對臨界資源訪問的唯一性。

而系統中某些資源一次只允許乙個程序使用,稱這樣的資源為臨界資源或互斥資源。

**實現:

執行結果:

執行fifo_write

執行fifo_read,可以讀到寫端寫入的內容:

最快的程序間通訊方式

共享記憶體原理

在物理記憶體中開闢一塊記憶體空間

將這塊記憶體空間通過頁表對映到程序的虛擬位址空間中

程序可以直接通過程序虛擬位址訪問到這塊物理記憶體,進行操作(若多個程序對映同一塊物理記憶體,就可以實現相互通訊--直接通過虛擬位址改變記憶體中的資料,其它程序也會隨之改變相較於其它程序間通訊少了兩步核心態和使用者態之間的資料拷貝過程)因此速度最快。

解除對映關係

刪除共享記憶體

**實現:

執行結果:

ipcs檢視程序間通訊方式

結果如下:

我們可以看到有如圖這幾種程序間通訊,其中0x01234567就是我們剛才建立的那塊共享記憶體。nattch表示對映鏈結數。

ipcs有以下幾個選項:

ipcrm用於刪除ipc,具體語法:ipcrm -m shmid

作業系統在核心中為使用者建立的乙個佇列,其它程序可以通過訪問相同的佇列進行通訊。

訊息佇列傳輸的是有型別的資料塊,按照型別來接收的時候,可以理解為乙個優先順序佇列。

訊息佇列的生命週期隨核心。

訊號量:用於實現程序間同步與互斥

訊號量相當於乙個核心中的計數器-----資源計數(統計現在有多少資源,判斷是否能夠進行操作)

同步:時序合理----功能:計數器+等待與喚醒+等待佇列

互斥:唯一訪問

在對資源進行訪問操作之前,先判斷訊號量計數(是否有資源能夠進行操作)

若計數<=0則等待(等待別人建立資源)計數-1,等待在等待佇列上。

若計數》0則直接返回(按照程式流程就可以直接操作資源了)計數-1

其它程序建立了資源,計數+1,並且喚醒等待佇列上的那些程序。

我們可以將訊號量理解為乙個倉庫,裡面放有很多資源,這個倉庫有它的容量以及當前存放資源個數。p操作就是從倉庫拿出資源,相對的v是往倉庫中放置資源,具體過程就是上面我們所說到的計數等待與喚醒。

p操作:資源個數-1,減過之後資源個數》=0,則表示拿到資源,可以進行操作,否則阻塞。

v操作:資源個數+1,加過之後資源個數小於等於容量,說明新增成功,進一步完成喚醒及具體操作,否則阻塞。

linux程序間通訊 IPC 幾種方式

linux程序間通訊 ipc 有幾種方式,下面將將簡單的簡述一下 一。管道 pipe 管道是linux支援的最初ipc方式,管道可分為無名管道,有名管道等。一 無名管道,它具有幾個特點 1 管道是半雙工的,只能支援資料的單向流動 兩程序間需要通訊時需要建立起兩個管道 2 無名管道使用pipe 函式建...

幾種程序間的通訊方式

管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對...

程序間的幾種通訊方式

管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 named pipe 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊號量 semophore 訊號量是乙個計數器,可以用來控制多個程序對...