Linux程序間通訊4 6

2021-08-13 03:22:06 字數 3621 閱讀 8106

linux

使用的程序間通訊方式包括:

1、管道(

pipe

)和有名管道(

fifo

2、訊號(

signal

3、共享記憶體

4、訊息佇列

5、訊號量

6、套接字(

socket

本文介紹4-6的通訊方式

4、訊息佇列

unix

早期通訊機制之一的訊號能夠傳送的資訊量有限,管道則

只能傳送無格式的位元組流

,這無疑會給應用程式開發帶來不便。

訊息佇列(也叫做報文佇列)則克服了這些缺點。

訊息佇列

就是乙個訊息的鍊錶

.可以把訊息看作乙個記錄,具有特定的格式

.程序可以向中按照一定的規則新增新訊息

;另一些程序則可以從訊息佇列中讀走訊息

目前主要有兩種型別的訊息佇列:

posix

訊息佇列

以及系統

v訊息佇列,系統

v訊息佇列目前被大量使用

系統v訊息佇列是隨核心持續的,

只有在核心重起或者人工刪除時,該訊息佇列才會被刪除

訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應

唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,

必須提供該訊息佇列的鍵值

設定鍵值

#include types.h

>

#include ipc.h

>

key_t

ftok

(char*pathname, char

proj)

功能:  

返回檔名對應的鍵值。

pathname: 

檔名proj

: 專案名(不為

0即可)

開啟訊息佇列

#include types.h

>

#include ipc.h

>

#include msg.h

>

intmsgget

(key_t

key,

intmsg***)

key:鍵值,由

ftok

獲得。

msg***

:標誌位。

返回值:與健值

key相對應的訊息佇列描述字

ipc_creat     建立新的訊息佇列

ipc_excl        與ipc_creat

一同使用,表示如果要建立的訊息佇列已經存在,則返回錯誤。

ipc_nowait   讀寫訊息佇列要求無法得到滿足時,不阻塞

在以下兩種情況下,將建立乙個新的訊息佇列:

1、如果沒有與健值

key相對應的訊息佇列,並且

msg***

中包含了

ipc_creat

標誌位。

2、key引數為

ipc_private

傳送訊息

include>

#include>

#include>

intmsgsnd

(int

msqid,struct

msgbuf

*msgp,int

msgsz,int

msg***)

功能:向訊息佇列中傳送一條訊息

接收訊息

#include>

#include>

#include>

intmsgrcv

(int

msqid

, struct

msgbuf

*msgp

, int

msgsz, long

msgtyp

, int

msg***)

功能:從msqid

代表的訊息佇列中讀取乙個

msgtyp

型別的訊息,並把訊息儲存在

msgp

指向的msgbuf

結構中。

在成功地讀取了一條訊息以後,佇列中的這條訊息將被刪除

5、訊號量

訊號量(

又名:訊號燈

)與其他程序間通訊方式不大相同,主要用途是

保護臨界資源.

程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,

還可用於程序同步

訊號量的分類:

二值訊號燈

:訊號燈的值只能取0或

1,類似於互斥鎖。 但兩者有不同:

訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;

互斥鎖更強調程序,占用資源的程序使用完資源後,必須由程序本身來解鎖。

計數訊號燈

:訊號燈的值可以取任意非負值

6、套接字

1、 socket套接字:

socket起源於unix,而unix/linux基本哲學之一就是「一切皆檔案」,都可以用「開啟open –> 讀寫write/read –> 關閉close」模式來操作。socket就是該模式的乙個實現,socket即是一種特殊的檔案,一些socket函式就是對其進行的操作(讀/寫io、開啟、關閉).

說白了socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

注意:其實socket也沒有層的概念,它只是乙個facade設計模式的應用,讓程式設計變的更簡單。是乙個軟體抽象層。在網路程式設計中,我們大量用的都是通過socket實現的。

2、套接字描述符

其實就是乙個整數,我們最熟悉的控制代碼是0、1、2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0、1、2是整數表示的,對應的file *結構的表示就是stdin、stdout、stderr。

套接字api最初是作為unix作業系統的一部分而開發的,所以套接字api與系統的其他i/o裝置整合在一起。特別是,當應用程式要為網際網路通訊而建立乙個套接字(socket)時,作業系統就返回乙個小整數作為描述符(descriptor)來標識這個套接字。然後,應用程式以該描述符作為傳遞引數,通過呼叫函式來完成某種操作(例如通過網路傳送資料或接收輸入的資料)。

在許多作業系統中,套接字描述符和其他i/o描述符是整合在一起的,所以應用程式可以對檔案進行套接字i/o或i/o讀/寫操作。

當應用程式要建立乙個套接字時,作業系統就返回乙個小整數作為描述符,應用程式則使用這個描述符來引用該套接字需要i/o請求的應用程式請求作業系統開啟乙個檔案。作業系統就建立乙個檔案描述符提供給應用程式訪問檔案。從應用程式的角度看,檔案描述符是乙個整數,應用程式可以用它來讀寫檔案。

Linux程序間通訊

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

Linux程序間通訊

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

Linux程序間通訊

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