一、訊息佇列概念:
訊息佇列就是乙個訊息的鍊錶。而一條訊息可以看做乙個記錄,具有特定的格式,程序可以按照一定的規則新增新訊息,另乙個程序可以從訊息佇列中獨自訊息。
二、訊息佇列函式
1.建立/開啟訊息佇列
man msgget(key_t key , int msg***)
返回值:
成功:返回訊息佇列的id「
失敗 : 失敗返回-1
引數:
key :鍵值
msg***:開啟標誌,ipc_creat表明建立乙個訊息 2
.傳送資料
msgsnd(int msqid , const void *msgp, size_t msgsz,int msg*** )
struct msgbuf ;
功能:傳送訊息到訊息佇列
返回值:
失敗:-1
成功:0
引數:msqid:訊息佇列的id
msgq:指向要傳送的訊息,
msgsz:訊息的長度,不包含型別
msgfg:標誌位
3.從訊息佇列中接收訊息
sszie_t msgrcv(int msqid , void *msgp , size_t msgsz , long msgtyp, int msg***)
返回值:
失敗:-1
成功:返回實際接收訊息的長度
引數:msqid:訊息佇列的id
msgp:存放取出的訊息
msgsz
:取出訊息的最大長度
msgtyp:
=0 直接忽略型別,只取訊息佇列中的第乙個訊息
>0 取訊息佇列中型別等於msgtyp的第一條訊息
<0 取訊息佇列中型別比msgtyp要小或者等於的訊息,如果小多條訊息滿足條件,則取型別最小的型別
msg***:標誌 4
.從訊息佇列中刪除訊息
int msgct(int msqid , int cmd,struct msqid_ds* buf)
返回值:
成功返回 0
失敗 -1
引數:msqid :訊息佇列的id
cmd:對訊息佇列要執行的命令,ipc_rmid用來刪除訊息佇列
buf:獲取核心中的
msqid_ds結構,通常不用
三、訊息佇列綜合例項:
a程序:
1.建立訊息佇列
2. while迴圈
2.1 從鍵盤中獲取輸入,包括訊息的型別以及訊息的資料
2.2. 傳送到訊息佇列
3.刪除訊息佇列
send.c
receicve.c#include
#include
#include
#include
#include
/*定義訊息的結構*/
struct
msgbuf
;
int
main
()
獲取訊息資料
printf
("please input message content\n"
);
scanf
("%s"
,str
);
msgs
.msgtype
=msg_type
;
strcpy
(msgs
.msgtext
,str
);
傳送訊息
msgsnd
(msgid
,&msgs
,sizeof
(struct
msgbuf),0
);
}
//3 刪除訊息佇列
msgctl
(msgid
,ipc_rmid,0
);
return
0;
}
#include
#include
#include
#include
#include
/*定義訊息的結構*/
struct
msgbuf
;
int
main
()
獲取訊息資料
printf
("please input message content\n"
);
scanf
("%s"
,str
);
msgs
.msgtype
=msg_type
;
strcpy
(msgs
.msgtext
,str
);
傳送訊息
msgsnd
(msgid
,&msgs
,sizeof
(struct
msgbuf),0
);
}
//3 刪除訊息佇列
msgctl
(msgid
,ipc_rmid,0
);
return
0;
}
程序通訊(訊息佇列)
訊息佇列與管道不同的是,訊息佇列是基於訊息的,而管道是基於位元組流的,且訊息佇列的讀取不一定是先入先出。訊息佇列與命名管道有一 樣的不足,就是每個訊息的最大長度是有上限的 msgmax 每個訊息佇列的總的位元組 數是有上限的 msgmnb 系統上訊息佇列的總數也有乙個上限 msgmni ipc物件資...
程序通訊 訊息佇列
訊息佇列的使用 建立開啟訊息佇列msgget 讀資料從佇列msgrcv 寫資料到佇列msgsnd 控制訊息佇列msgctl 目前主要有兩種型別的訊息佇列 posix訊息佇列以及系統v訊息佇列,系統v訊息佇列目前被大量使用 訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得...
Linux程序通訊 訊息佇列
1.訊息佇列 訊息佇列也稱為報文佇列,訊息佇列是隨核心持續的,只有在核心重起或顯示刪除乙個訊息佇列時,該訊息佇列才會真正刪除 系統中記錄訊息佇列的資料結構struct ipc ids msg ids位於核心中,系統中所有訊息佇列都可以在結構msg ids中找到訪問入口 訊息佇列其實就是乙個訊息的鍊錶...