Linux程序間通訊(3) 訊息佇列

2021-10-03 22:06:42 字數 2155 閱讀 1074

由核心建立的用於存放訊息的鍊錶,分為:system v訊息佇列,posix訊息佇列。

對posix訊息佇列的讀總是返回最高優先順序的最早訊息。

對system v訊息佇列的讀可以返回任意指定優先順序的訊息

使用步驟

使用mesgget函式建立新的訊息佇列,或者獲取已存在的訊息佇列,並返回唯一標識,後續收發訊息需要制定該識別符號,以說明操作的是哪個佇列的訊息

函式定義:int msgget (key_t key,int msg***);

第乙個引數——key值,使用ftok(const char *path,int proj_id);來生成key值,只要路徑值和整形引數值不變,對應的key值就不變。ftok只會使用整形值的低8位,因此指定乙個ascii碼值即可。

該函式會返回乙個key值,先執行的key值根據key來建立物件,後執行的程序根據key來開啟物件。

第二個引數——msg***:許可權標誌

收發訊息

(1)傳送:程序先封裝一條訊息,呼叫api傳送,使用msgsnd函式

函式定義:int msgsnd( int msgqid,const void *msgp,size_t msgsz,int msgflag);

第乙個引數——已開啟的訊息佇列的id(msgget函式的返回值)

第二個引數——指向要傳送訊息所在的記憶體

第三個引數——是要傳送訊息的長度

第四個引數——是控制函式行為的標誌,可以取0(忽略標誌位)、ipc_nowait(訊息佇列已滿,阻塞訊息進入佇列)

(2)接收:根據訊息佇列id和訊息id,呼叫api接收訊息,在成功地讀取一條訊息後,佇列中的這條訊息將被刪除。使用msgrcv函式

函式定義:int msgrcv(int msqid, struct msgbuf *msgp,int msgsz,long msgtyp,int msg***);

第乙個引數——已開啟的訊息佇列的id(msgget函式的返回值)

第二個引數——指向要接受訊息所在的記憶體

第三個引數——是要接受訊息的長度

第四個引數——指定了函式從佇列中所取得的訊息型別。函式將從佇列中搜尋型別與之匹配的訊息並將之返回。但如果msgtyp的值為0,函式直接返回佇列中最開始的訊息

第五個引數——控制函式行為的標誌位,可以取0(忽略標誌位)、ipc_nowait(訊息隊列為空,則返回enomsg)

使用msgctl函式,根據訊息列表id,刪除指定訊息佇列

函式定義:int msgctl(int msgqid, int cmd,struct msqid_ds *buf);

第乙個引數——已開啟的訊息佇列的id(msgget函式的返回值)

第二個引數——是函式要對訊息佇列進行的操作,比如:

(1)ipc_stat:取出系統儲存的訊息佇列的msqid_ds 資料,並將其存入引數buf 指向msqid_ds 結構中。

(2)ipc_set:設定訊息佇列的msqid_ds 資料中的msg_perm 成員。設定的值由buf 指向的msqid_ds結構給出。

(3)ipc_emid:將佇列從系統中刪除。

返回值——成功返回0;若失敗返回-1。

父子間程序收發訊息

#include

#include

#include

#include

#include

#include

#include

typedef

struct

msg;

#define msg_key 10

intmain()

pid_t pid =

fork()

;if(pid==-1

)if(pid ==0)

printf

("receive:%s\n"

,msgp->dat)

;memset

(msgp->dat,0,

sizeof

(msgp->dat));

}}else

if(pid >0)

}if(msgctl

(msgqid,ipc_rmid,

null)==

-1)}

return0;

}

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