Linux 程序間通訊(1)訊息佇列 msg

2021-09-27 07:10:11 字數 3254 閱讀 9817

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下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...