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.管道與...