Linux 程序間通訊

2021-09-19 12:11:11 字數 3588 閱讀 1329

管道符|連線兩個命令,將前面命令的結果交給後面的命令處理

重定向修改資料流向

>標準輸出(終端顯示器)重定向 清除原有內容,將新內容寫入

>>標準輸出(終端顯示器)重定向 向原有內容最後追加內容

原理:作業系統在核心中提供一塊緩衝區(只要程序能夠訪問到這塊緩衝區就可以實現)

管道建立成功後,會提供兩個檔案描述符來供使用者實現程序間通訊,乙個讀,乙個寫,這樣就可以由使用者自己來確定通訊的方向

分類:特性:1、匿名管道僅僅適用於具有親緣關係的程序間通訊,命名管道可用於任意(本機)程序間通

2、管道的讀寫特性

程序進行管道操作時,如果沒有用到某一端,則把這一端關閉掉

3、半雙工特性

管道是乙個半雙工通訊方式,所以乙個管道使用的時候就必須確定資料流向,但是又不能一建立就確定,因此作業系統也不能確定誰讀誰寫,所以不能確定方向。因此,我們就提供兩個描述符來供你們使用,乙個讀,乙個寫,那麼確定方向就是將對應的一段關閉掉就可以,這樣作業系統就把方向的控制權交給我們使用者了

4、管道的生命週期跟隨程序(程序退出,管道釋放)

5、管道提供流式服務

資料的流式服務,體現的是資料的傳送和接受的靈活性,但資料沒有邊界,容易粘包(多條資料連線到一起,接收方沒有辦法分辨資料界限)(可以一次性將資料全都寫完,也可以寫一部分,可以一次性將資料全都讀完,也可以讀一部分)

6、管道自帶同步與互斥功能

站在檔案描述符的角度理解管道

匿名管道

核心中的一段緩衝區

建立匿名管道

int

pipe

(int fd[2]

);fd //檔案描述符陣列

fd[0]

//讀端

fd[1]

//寫端

返回值 //成功返回0

//失敗返回錯誤**

特性:

命名管道

為管道建立了乙個檔案,這個管道檔案就是管道的名字

建立命名管道

mkfifo  filename  //命令

intmkfifo

(const

char

*filename, mode_t mode)

//庫函式

filename //命名管道的檔名及路徑

mode //檔案許可權

返回值 //成功 0

//失敗 -1

特性:1、有名字:體現在檔案系統可見性,因為其他程序都能看到這個檔案,因此都能開啟,可用於任意(本機)程序間通訊2、不僅具備匿名管道的讀寫特性,並且還有自己的開啟特性

共享記憶體是程序間通訊中最快的一種,其他的程序間通訊方式都會涉及到將使用者空間的資料拷貝到核心空間(因為公共的緩衝區都在核心空間),這是兩部操作,而共享記憶體的原理是兩個或多個程序將同一塊物理記憶體對映到自己的虛擬位址空間,以這種方式實現資料共享,操作這個虛擬位址就是操作這塊物理記憶體。相較於其他的通訊方式,少了兩步使用者空間和核心空間的拷貝過程,因此速度最快。

共享記憶體的操作步驟

1、建立/開啟一塊共享記憶體

int

shmget

(key_t key, size_t size,

int shm***)

; key //共享記憶體名(共享記憶體在系統中的標識)

//ftok這個介面可以通過乙個檔案計算出乙個key值

size //共享記憶體大小

shm*** //九個許可權標誌位 用法和建立檔案時使用的mode模式標誌

返回值 //成功返回共享記憶體的識別符號(共享記憶體的操作控制代碼shmid)(數字)

//失敗-1

2、將這塊共享記憶體對映到自己的虛擬位址空間

void

*shmat

(int shmid,

const

void

*shmaddr,

int shm***)

; shmid //共享記憶體控制代碼

shmaddr //對映首位址(通常置空,讓作業系統自己尋找虛擬位址空間,降低失敗的可能性)

shm*** //shm_rdonly 唯讀

//shm_rnd 否則可讀可寫

返回值 //對映到虛擬位址空間的首位址

//失敗 -1(需要強制型別轉換)

3、使用記憶體空間(io操作等)

4、解除對映關係

int

shmdt

(const

void

*shmaddr)

; shmaddr //對映首位址

返回值 //成功 0

//失敗 -1

5、刪除共享記憶體

int

shmctl

(int shmid,

int cmd, strunt shmid_ds *buf)

; cmd //ipc_pmid 刪除共享記憶體

buf //存放獲取到的共享記憶體資訊

//共享記憶體並不會直接刪除,而是判斷對映連線數是否為0,

//為0,直接刪除

//不為0,拒接後續其他程序的對映連線,當對映連線數為0時,自動刪除

在核心中建立乙個訊息佇列(全雙工通訊),其他所有程序都可以通過相同的ipc_key開啟訊息佇列,這時候既可以向佇列中放資料,也可以從佇列中拿資料。(這樣的話就有可能會拿錯了,拿到自己的資料,因此訊息佇列中能夠放的資料是有型別的資料塊,並且讀寫的時候只能按訊息塊來傳送接受)

檢視訊息佇列ipcs -q

訊號量實現同步:如果現在沒有資源,等待別人釋放資源,別人釋放資源後會通知等待的人,

訊號量實現互斥:一元訊號量實現互斥,(計數不是0就是1)

Linux程序間通訊

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

Linux程序間通訊

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

Linux程序間通訊

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