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