Linux 程序間通訊

2021-10-03 00:06:40 字數 3026 閱讀 1541

為什麼作業系統要為程序提供通訊方式,而不是程序之間直接通訊

作業系統如何讓程序之間進行通訊

將系統核心的一塊緩衝區作為公共媒介,讓多個程序可以訪問從而實現程序通訊。在乙個程序中建立乙個管道,作業系統為了能讓該程序對其建立出來的管道進行讀寫操作,會向該程序返回兩個操作控制代碼(檔案描述符),乙個用於讀,乙個用於寫。

);用於建立乙個匿名管道,並且通過引數返回兩個管道的操作控制代碼。

pipfd[0]

;用於從管道中讀取資料

pipfd[1]

;用於從管道中寫入資料

makffio

(char

*filename,mode_t mode)

;filename//命名管道的識別符號

mode//管道的許可權資訊

//example

makffio

("make"

,0664);

//建立乙個名稱為make的管道,許可權資訊為664

管道的讀寫特性管道本質是作業系統核心中的一塊緩衝區,多個程序通過訪問同乙個緩衝區實現通訊。

管道的特性

將一塊物理位址對映到程序的虛擬位址空間中,程序通過自己的虛擬位址空間可以訪問到該共享記憶體,從而實現通訊。

每個虛擬位址中都有乙個共享區,用來存放共享物理記憶體的虛擬位址,通過自己的頁表對映到共享的物理記憶體,從而可以對該記憶體進行操作,同時另乙個程序的虛擬位址空間也對映到該物理記憶體中,也可以對其進行操作,從而實現通訊。

最快的通訊方式

共享記憶體建立函式

共享記憶體的建立與開啟

#include

#include

intshmget

(key_t key,size_t size,

int shm***)

;key:共享記憶體的識別符號,多個程序通過表示符,才能訪問同一塊共享記憶體

size:要建立共享記憶體的大小

shm***:

ipc_private 私有,只能用於親屬關係的程序間通訊

ipc_creat 共享記憶體不存在則建立,存在開啟

ipc_excl 與ipc_creat同時使用,不存在則建立,存在則報錯

返回值:共享記憶體在**中的操作控制代碼

程序間通訊標key值的生成。

#define proj_id 0x1234678

key_t ftok

(const

char

*pathname,

int proj_id)

;pathname:是檔案資訊,目錄路徑

shmat用於將建立好的共享記憶體,對映到程序的虛擬位址空間中。

void

*shmat

(int shmid,

const

void

*shmaddr,

int shm***)

;shmid:建立記憶體時返回的操作控制代碼

shm***:在共享記憶體具有許可權的基礎上,可以設定在**中的操作許可權

shm_rdonly:唯讀許可權

預設為0,可讀可寫

shmctl共享記憶體管理

int

shmctl

(int shmid,

int cmd,

struct shmid_ds *buf)

;shmid:操作控制代碼

cmd:對共享記憶體想要進行的操作

1buf:在管理共享記憶體的時候,通過該結構體返回資料,或者設定新的資料

共享記憶體的本質不同的程序通過鏈結同一塊物理記憶體,實現資料傳輸,從而實現通訊。

特性

ipcs 檢視程序中通訊資源

本質

在作業系統核心中,建立乙個優先順序佇列,多個程序間通過向佇列中新增資料塊或者獲取資料塊,從而實現通訊。

特性

訊號量本身並不是實現通訊的,而是用於實現程序的同步與互斥。(保護程序間訪問臨界資源的時候不會出現資料二義性)

同步:通過一定條件判斷,實現程序間對臨界資源訪問的時序合理性。

互斥:通過同一時間的唯一訪問,實現程序間對臨界資源訪問的安全性。

臨界資源:程序間都能訪問的資源。

臨界區:對臨界資源進行操作的**區。

訊號量的本質

計數器+pcb等待佇列

訊號量同步的實現

資料是資源,初始化的時候有多少資料資源,計數器就會初始化相應的數量。

程序a去獲取資源,若計數器》0,表示有資源,可以直接獲取,同時計數-1;若計數器<=0,表示沒有資源,則需要排程使得程序陷入休眠的介面,讓程序等待-1。

程序b產生乙個資源,判斷若計數器<0,則呼叫喚醒乙個休眠程序的介面,喚醒乙個等待程序a,計數器+1;若計數器》=0,表示沒有人等待資源,計數器直接+1即可。

訊號量互斥的實現

當資料資源唯一時,在程序a訪問臨界資源時,將計數從1減為0(其他程序這時如果繼續訪問就會陷入等待佇列中)

當等待程序a中的資源訪問完畢時,將計數器進行+1(喚醒等待佇列中的程序,各程序之間重新開始搶奪資源)

Linux程序間通訊

程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...

Linux程序間通訊

謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...