2. 訊息佇列介面-msgget 和 ftok
3. 訊息佇列介面-msgctl
4. 訊息佇列介面-msgsnd
5. 訊息佇列介面-msgrcv
6. 訊息佇列兩個命令-ipcs
參考:其實,就是程序間通訊。
linux中的訊息佇列是程序間通訊的一種方式
通過建立乙個訊息佇列可以完成乙個或者多個程序的資訊交匯
其實就是乙個檔案。
訊息佇列的本質其實是乙個核心提供的鍊錶。
核心基於這個鍊錶,實現了乙個資料結構,並且通過維護這個資料結構來維護這個訊息佇列。
向訊息佇列中寫資料,實際上是向這個資料結構中插入乙個新結點;
從訊息佇列彙總讀資料,實際上是從這個資料結構中刪除乙個結點。
每個訊息的最大長度是有上限的(msgmax) 其中,ubuntu下 msgmax = 8192
每個訊息佇列的總的位元組數(msgmnb) 其中,ubuntu下 msgmnb= 16384
系統上訊息佇列的總數上限(msgmni) 其中,ubuntu下 msgmni= 32000
可以用cat /proc/sys/kernel/msgmax檢視具體的資料
功能:函式ftok把乙個已存在的路徑名和乙個整數識別符號轉換成乙個key_t值,稱為ipc鍵值(也稱ipc key鍵值)
所需標頭檔案
#include
#include
函式說明
把從pathname匯出的資訊與id的低序8位組合成乙個整數ipc鍵
函式原型
key_t ftok(const char *pathname, int proj_id)
函式傳入值
pathname:指定的檔案,此檔案必須存在且可訪問
proj_id:計畫代號(project id)
proj_id值的意義讓乙個檔案也能生成多個ipc key鍵值。ftok利用同一檔案最多可得到ipc key鍵值0xff(即256)個,因為ftok只取proj_id值二進位制的後8位,即16進製制的後兩位與檔案資訊合成ipc key鍵值。
函式返回值
成功:返回key_t值(即ipc 鍵值)
出錯:-1,錯誤原因存於error中
附加說明
key_t一般為32位的int型的重定義
參考:
int msgget(key_t key, int msg***);
功能:建立和訪問乙個訊息佇列
引數:key:某個訊息佇列的名字,用ftok()產生
key_t ftok(const char *pathname, int proj_id);
呼叫成功返回乙個key值,用於建立訊息佇列,如果失敗,返回-1
msgflag:有兩個選項ipc_creat和ipc_excl,
單獨使用ipc_creat,如果訊息佇列不存在則建立之,如果存在則開啟返回;
單獨使用ipc_excl是沒有意義的;
兩個同時使用,如果訊息佇列不存在則建立之,如果存在則出錯返回。
msgflag說明:
除了以上的兩個標誌以外,在msg*** 標誌中還可以有訪問許可權控制符。這種控制符的意義和檔案系統中的許可權控制符是類似的。
flag標誌由兩部分組成,一為ipc物件訪問許可權(含義同ipc_perm中的mode),一為ipc物件建立模式標誌(ipc_creat、ipc_excl),兩者進行|運算合成ipc物件建立許可權。
返回值:成功返回乙個非負整數,即訊息佇列的標識碼,失敗返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:訊息佇列的控制函式,如刪除
引數:
msqid:由msgget函式返回的訊息佇列標識碼
cmd:有三個可選的值,在此我們使用ipc_rmid
ipc_stat 把msqid_ds結構中的資料設定為訊息佇列的當前關聯值
ipc_set 在程序有足夠許可權的前提下,把訊息佇列的當前關聯值設定為msqid_ds資料結構中給出的值
ipc_rmid 刪除訊息佇列
返回值:成功返回0,失敗返回-1
常用: return msgctl(ifd, ipc_rmid, 0); 刪除訊息佇列
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msg***);
功能:把一條訊息新增到訊息佇列中
引數:
msgid:由msgget函式返回的訊息佇列標識碼
msgp: 指標指向準備傳送的訊息
msgze:msgp指向的訊息的長度(不包括訊息型別的long int長整型)
msg***:預設為0
返回值:成功返回0,失敗返回-1
訊息結構一方面必須小於系統規定的上限,另一方面必須以乙個long int長整型開始,接受者以此來確定訊息的型別
struct msgbuf
;
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);
引數:
msqid: 由訊息佇列的識別符號
ptr :訊息緩衝區指標。訊息緩衝區結構為:
struct msgbuf {
long mtype;
char mtext[1];
}length: 訊息資料的長度
type: 決定從佇列中返回哪條訊息:
=0 返回訊息佇列中第一條訊息
>0 返回訊息佇列中等於mtype 型別的第一條訊息。
<0 返回mtype<=type 絕對值最小值的第一條訊息。
msg*** 為0表示阻塞方式,設定ipc_nowait 表示非阻塞方式
返回值:
成功返回實際放到接收緩衝區裡去的字元個數,失敗返回-1
msgrcv 呼叫成功返回0,不成功返回-1。
此外,我們還需要學習兩個重要的命令
前面我們說過,訊息佇列需要手動刪除ipc資源
ipcs:顯示ipc資源
ipcrm:手動刪除ipc資源
Linux程序間通訊 訊息佇列
linux和類linux系統下程序間通訊 inter process communication,ipc 有很多種方式,包括套接字 socket 共享記憶體 shared memory 管道 pipe 訊息佇列 message queue 等,各自有各自的一些應用場景和用途,這次就來聊一聊訊息佇列這...
linux程序間通訊 訊息佇列
訊息佇列由id 唯一標識 訊息佇列就是乙個訊息的列表,使用者可在佇列中新增,讀取訊息等 可按照型別來收發訊息 int msgget key t key,int flag int msgsnd int msqid,const void msgp,size t size,int flag msqid 訊...
Linux程序間通訊 訊息佇列
首先上篇文章我們說到了linux下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...