宣告:侵刪
訊息佇列是system v ipc物件的一種 存放在記憶體中由核心來維護
訊息佇列由訊息佇列id來唯一標識
訊息佇列就是乙個訊息的鍊錶。使用者可以在訊息佇列中新增訊息、讀取訊息
訊息佇列提供了乙個從乙個程序向另外乙個程序傳送一塊資料的方法,並且每一塊資料塊都有乙個型別
訊息佇列可以按照型別來傳送/接收訊息
與管道一樣,訊息佇列中資料被讀取會刪除 管道必須先進先出 而訊息佇列不用遵循
訊息佇列在核心中的表
訊息佇列使用步驟
①開啟/建立訊息佇列 msgget
② 向訊息佇列傳送訊息 msgsnd
③從訊息佇列接收訊息 msgrcv
④控制訊息佇列 msgctl
傳送訊息必須確定訊息格式
通訊雙方首先定義好統一的訊息格式
使用者根據應用需求定義結構體型別
首成員型別為long,代表訊息型別(正整數)
其他成員都屬於訊息正文
開啟建立訊息佇列 msgget函式
傳送訊息 msgsnd函式
接收訊息 msgrcv函式
訊息佇列控制 msgctl函式
訊息傳送端
/*msgsnd.c*/
#include
#include
#include
#include
#include
#include
#include
#define ipc_path "/"
#define ipc_prj 1
#define msg_txt_size 512
#define msg_len sizeof(msg)-sizeof(long)
typedef
struct
msg;
intmain()
/*建立訊息佇列,獲取訊息佇列id*/if(
(msg_id =
msgget
(msg_key,ipc_creat|
0666))
<0)
system
("ipcs -q ");
/*獲取終端輸入資訊,向訊息佇列發訊息*/
while(1
) msg.msg_type =
getpid()
;/*將訊息型別設定為當前程序id*/if(
msgsnd
(msg_id,
&msg,msg_len,0)
<0)
/*堵塞*/if(
strncmp
(msg.msg_txt,
"quit",4
)==0)
}/*刪除訊息佇列*/if(
msgctl
(msg_id,ipc_rmid,
null
)<0)
exit(0);}
訊息接收端
/*msgrcv.c*/
#include
#include
#include
#include
#include
#include
#include
#define ipc_path "/"
#define ipc_prj 1
#define msg_txt_size 512
#define msg_len sizeof(msg)-sizeof(long)
typedef
struct
msg;
intmain()
/*建立訊息佇列,獲取訊息佇列id*/if(
(msg_id =
msgget
(msg_key,ipc_creat|
0666))
<0)
system
("ipcs -q ");
/*獲取訊息佇列訊息,向終端列印*/
doprintf
("the message from process[%ld]:%s\n"
,msg.msg_type,msg.msg_txt);}
while
(strncmp
(msg.msg_txt,
"quit",4
)!=0)
;system
("ipcs -q");
printf
("message queue was delete\n");
exit(0);}
結果 程序間通訊之訊息佇列
include include define max msg buf len 512 int ikey 6004 struct ipcmsgbuf int main void 寫訊息佇列 memset msgdata,0,sizeof struct ipcmsgbuf msgdata.mtype 1...
程序間通訊之訊息佇列
訊息佇列其實就是提供了一種從乙個程序向另乙個程序傳送乙個資料塊的方法。我們可以通過傳送訊息來避免命名管道的同步和阻塞問題。此外,訊息佇列和管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列不一定是先入先出。訊息佇列與命名管道有一樣的不足,就是每個訊息的最大長度是有上限的 msgm...
程序間通訊之訊息佇列
訊息佇列 訊息佇列本質上是提供了一種從乙個程序向另乙個程序傳送資料快的方法。每個資料快都被認為是有乙個型別,接受者程序接收的資料塊可以有不同的型別值。訊息佇列和管道的區別 1 訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先進先出的。2 訊息佇列的生命週期是隨核心的 不隨程序...