程序間通訊之訊息佇列

2021-08-06 06:42:07 字數 2616 閱讀 2197

一訊息佇列:

1,訊息佇列就是乙個訊息的鍊錶,把訊息看做乙個記錄,具有特定格式。 程序可以向其中按照一定的規則新增新訊息;另一些程序則可以從訊息佇列中讀走訊息。

2,分類:posi訊息佇列,系統v訊息佇列(大量使用)

3,鍵值:訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述符,必須提供該訊息佇列的鍵值。

#include

#include

key_t ftok(char *pathname, char proj);

功能:返回檔名對應的鍵值。

pathname:檔名

proj:專案名(不為0即可)

4,建立:

#include

#include

#include

int msgget(key_t key, int msg***)

key: 鍵值,由ftok獲得

msg***:標誌位

返回值:與鍵值key相對應的訊息佇列的描述符。

msglg取值:

ipc_creat:建立新佇列

ipc_excl :與ipc_creat一同使用,表示如果要建立的訊息佇列已經存在,則返回錯誤。

ipc_nowait  :讀寫訊息佇列要求無法得到滿足時,不阻塞  

//建立訊息佇列

//int msgget(key_t key, int msg***);

int msgid = msgget((key_t)123,0666 | ipc_creat);

if(msgid == -1)

5,傳送和接受訊息

傳送訊息:

#include

#include

#include

int msgsnd(int msqid, struct msgbuf * msgp, int msgsz, int msg***)

功能:向訊息佇列中傳送一條訊息

msqid:訊息佇列描述符

msgp:訊息佇列指標,指向存放訊息的結構

msgsz:訊息資料長度

msg***:傳送標誌,有意義的msg***標誌為ipc_nowait,指明在訊息佇列沒有足夠空間容納要傳送的訊息時,msgsnd是否等待

接收訊息:

#include

#include

int msgrcv(int msqid, struct msgbuf* msgp, int msgsz, long msgtyp, int msg***)

msqid:文字描述符

msgp:訊息返回後儲存在msgp指向的位址

msgsz:指定msgbuf的mtext成員的長度,即訊息內容的長度

msgtyp:請求讀取的訊息型別

成功則返回讀取訊息的位元組數,否則返回-1。

功能:從msqid代表的訊息佇列中讀取乙個msgtyp型別的訊息,並把訊息儲存在msgp指向的msgbuf結構中。在成功的讀取了一條訊息以後,佇列中的這條訊息將被刪除。

#include #include #include #include #include struct msgbuf 

;int main()

struct msgbuf msg;

msg.mtype = 2;

strcpy(msg.mtext,"csdn");

//傳送訊息

//int msgsnd(int msqid, struct msgbuf * msgp, int msgsz, int msg***)

int ret = msgsnd(msgid,&msg,1024,ipc_nowait);

if(ret == -1)

//接收訊息

//ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msg***);

int ret2 = msgrcv(msgid,&msg,1024,2,ipc_nowait);

if(ret2 == -1)

printf("%s\n",msg.mtext);

return 0;

}

輸出結果:

[root@promote 4-訊息佇列]# gcc 1-訊息佇列.c 

[root@promote 4-訊息佇列]# ./a.out

csdn

6,訊息佇列控制:

int msgctl(int msgid, int command, struct msgid_ds *buf);  

command是將要採取的動作,它可以取3個值,

ipc_stat:把msgid_ds結構中的資料設定為訊息佇列的當前關聯值,即用訊息佇列的當前關聯值覆蓋msgid_ds的值。

ipc_set:如果程序有足夠的許可權,就把訊息列隊的當前關聯值設定為msgid_ds結構中給出的值

ipc_rmid:刪除訊息佇列

buf是指向msgid_ds結構的指標,它指向訊息佇列模式和訪問許可權的結構。msgid_ds結構至少包括以下成員:

struct msgid_ds  

;  成功時返回0,失敗時返回-1.

程序間通訊之訊息佇列

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 訊息佇列的生命週期是隨核心的 不隨程序...