訊息佇列就是乙個鍊錶, 存於核心之中
特點 :
相關api函式 :
#include
//建立/獲取訊息佇列 成功返回id 失敗-1
intmsgget
(key_t key,
int msg***)
;//第乙個引數: 索引值,以此來查詢佇列; 第二個引數:開啟方式,一般設定為 ipc_creat|0777
//傳送訊息 成功返回0 失敗返回-1
intmsgsnd
(int msgid,
const
void
*msgp, size_t msgsz,
int msg***)
;//第乙個引數: 訊息佇列id號,第二個引數:要傳送的內容,
//第三個引數: 傳送訊息的大小,第四個引數通常採用預設方式,即設定為0
//接收訊息
ssize_t msgrcv
(int msgid,
void
* msgp, size_t msgsz,
long msqtyp,
int msg***)
;//第二個引數:讀取訊息的快取區, 第三個引數:快取區的大小,
//第四個引數:訊息的型別(一般為整型),第五個引數通常採用預設接收方式,即設定為0
//控制訊息佇列,一般用於刪除 成功返回0 失敗返回-1
intmsgctl
(int msgid,
int cmd,
struct msgid_ds *buf)
;//第二個引數: 常用模式為 ipc_rmid(移除建立的佇列),
注: 確定key值時,通常採用 ftok() 函式進行確定, 並且在使用 msgsnd()和msgget() 函式時應線構造乙個結構體
//key值的確定
#include
#include
key_t ftok
(const
char
*pathname,
int proj_id)
;//第乙個引數: 指定的檔名 第二個引數: 子序號, 通常取 1-255整型數
//msgsnd()和msgget() 函式時應線構造乙個結構體
struct msgbuf
;
具體例項** :
①從佇列獲取資訊
#include
#include
#include
#include
#include
struct msgbuf //先定義結構體
;int
main()
//從訊息佇列中獲取資訊
msgrcv
(msgid,
&readbuf,
sizeof
(readbuf.mtext)
,888,0
);//888表示訊息佇列的訊號, 0表示預設讀取方式
printf
("get message: %s from que\n"
,readbuf.mtext)
;//獲取資訊後,進行反饋,也就是可以寫資訊到佇列
struct msgbuf sendbuf =
;msgsnd
(msgid,
&sendbuf,
strlen
(sendbuf.mtext),0
);msgctl
(msgid, ipc_rmid,
null);
//刪除建立的佇列,防占用記憶體
return0;
}
②傳送資訊到佇列
#include
#include
#include
#include
#include
struct msgbuf
;int
main()
;//定義傳送的型別以及內容
key_t key;
key =
ftok
(".",1
);//通過ftok()獲取key值
msgid =
msgget
(key, ipc_creat|
0777);
if(msgid ==-1
)//傳送資訊到佇列
msgsnd
(msgid,
&sendbuf,
strlen
(sendbuf.mtext),0
);//0表示預設不堵塞
//定義readbuf 進行接收來自佇列的反饋資訊
struct msgbuf readbuf;
msgrcv
(msgid,
&readbuf,
sizeof
(readbuf.mtext)
,999,0
);//999要和上端**一致
printf
("return %s from que\n"
,readbuf.mtext)
;msgctl
(msgid, ipc_rmid,
null);
return0;
}
兩段**可以實現不同程序間的通訊,而且可以滿足相互通訊(即可以進行反饋以及接收反饋)注: 傳送資訊和讀取資訊時,應保證 key 值相同, 以及訊息型別 type 相同
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下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...