1. 訊息佇列概述
訊息佇列就是一些訊息的列表,使用者可以在訊息佇列中新增訊息和讀取訊息等。訊息佇列具有一定的fifo特性,但是它可以實現訊息的隨機查詢,比fifo具有更大的優勢。同時,這些訊息優勢存在於核心中,由「佇列id」來標識。
2. 訊息佇列程式設計
2.1 程式設計說明
訊息佇列的實現包括以下4種操作:
2.2 函式介紹
msgget() 函式
/*****msgget()函式*****/
函式原型:int
msgget
(key_t key,
int msg***)
傳 入 值:key 訊息佇列的鍵值,多個程序可通過它訪問同乙個訊息佇列。ipc_private用於建立私有訊息佇列
msg*** 許可權標誌位
返 回 值:成功:訊息佇列id;
失敗:返回-
1
msgsnd() 函式
/*****msgsnd()函式*****/
函式原型:int
msgsnd
(int msqid,
const
void
*msgp, size_t msgsz,
int msg***)
傳 入 值:msqid 訊息佇列的佇列id
msgp 指向訊息結構的指標
msgsz 訊息正文的位元組數
msg*** 若為0表示呼叫阻塞直到傳送成功為止;ipc_nowait表示若訊息無法立即傳送,函式會立即返回
返 回 值:成功:返回0;失敗:返回-
1//訊息結構msgbuf的定義
struct msgbuf
msgrcv() 函式
/*****msgrcv()函式*****/
函式原型:int
msgrcv
(int msgid,
void
*msgp, size_t msgsz,
long
int msgtyp,
int msg***)
傳 入 值:msqid 訊息佇列的佇列id
msgp 指向訊息結構的指標,同msgsnd
()函式的msgp
msgsz 訊息正文的位元組數
msgtyp --
>為0表示接收訊息佇列中第一訊息;
-->大於0表示接收訊息佇列中第乙個型別為msgtyp的訊息;
-->小於0表示接收訊息佇列中第乙個型別值不小於msgtyp絕對值且型別值最小的訊息
msg*** --
>msg_noerror 若返回的訊息比msgsz位元組多,則訊息就會截短到msgsz位元組,且不通知訊息傳送程序;
-->ipc_nowait 若在訊息佇列中沒有相應型別的訊息可以接收,則函式立即返回;
-->
0msgsnd
()呼叫阻塞直到接收一條相應型別的訊息位置;
返 回 值:成功:返回0
失敗:返回-
1
msgctl() 函式
/*****msgctl()函式*****/
函式原型:int
msgctl
(int msgid,
int cmd,
struct msqid_ds *buf)
傳 入 值:msqid 訊息佇列的佇列id
cmd --
>ipc_stat 讀取訊息佇列的資料結構msqid_ds,並將其儲存在buf指定的位址中;
-->ipc_set 設定訊息佇列的資料結構msgid_ds中的ipc_perm域值,這個值取自buf引數;
-->ipc_rmid 從系統核心中刪除訊息佇列;
buf 描述訊息佇列的msqid_ds結構型別變數
返 回 值:成功:返回0
失敗:返回-
1
2.3 函式例項
下面的例項體現了如何使用訊息佇列進行兩個程序(傳送端和接收端)之間的通訊。訊息傳送端程序和訊息接收端程序間不需要額外實現程序間的同步。
訊息對傳送端**如下:
/*****msgsnd.c*****/
//省略標頭檔案
#define buffer_size 512
struct message
;int
main()
if((qid =
msgget
(key, ipc_creat|
0666))
==-1)
printf
("open queue %d\n"
,qid)
;while(1
) msg.msg_type =
getpid()
;if((
msgsnd
(qid,
&msg,
strlen
(msg.msg_text),0
))<0)
if((strncmp
(msg.msg_text,
"quit",4
))==0
)break;}
exit(0
);}
訊息佇列接收端的**如下:
/*****msgrcv.c*****/
//省略標頭檔案
#define buffer_size 512
struct message
;int
main()
if((qid =
msgget
(key, ipc_creat|
0666))
==-1)
printf
("open queue %d\n"
,qid);do
printf
("the message from process %d : %s"
,msg.msg_type,msg_msg_text);}
while
(strncmp
(msg.msg_text,
"quit",4
));if
((msgctl
(qid, ipc_rmid,
null))
<0)
exit(0
);}
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下進行程序間通訊的一種方法或機制匿名管道和命名管道,那麼這裡要說的是另外一種與之不同的通訊方法,即訊息佇列,兩者之間有相同也有不同的地方,具體的下面就一一介紹。一 什麼是訊息佇列?首先它也是一種進行程序間通訊的方式,通過乙個程序向另外乙個程序傳送資料塊的方式,每個資料...