Linux訊息佇列程式設計(簡單應用)

2021-08-23 14:40:39 字數 3569 閱讀 8544

訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息(資料)容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同(處理資料速度不同),系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。

最簡單的訊息記憶體的使用流程

①ftok函式生成鍵值

②msgget函式建立訊息佇列

③msgsnd函式往訊息佇列傳送訊息

④msgrcv函式從訊息佇列讀取訊息

⑤msgctl函式進行刪除訊息佇列

乙個訊息資料應該由以下乙個結構體組成,舉個例子

struct mymesg;
每乙個訊息佇列都有乙個對應的鍵值(key)相關聯(共享記憶體、訊號量也同樣需要)。

所需標頭檔案#include

函式原型key_t ftok(const char *path ,int id);

path為乙個已存在的路徑名

id為0~255之間的乙個數值,代表專案id,自己取

返回值:成功返回鍵值(相當於32位的int)。出錯返回-1

例如:key_t key = ftok( 「/tmp」, 66);

所需標頭檔案#include

函式原型int msgget(key_t key,int flag);

key為ftok生成的鍵值

flag為所需要的操作和許可權,可以用來控制建立乙個訊息佇列。

flag的值為ipc_creat:如果不存在key值的訊息佇列,且許可權不為0,則建立訊息佇列,並返回乙個訊息佇列id。如果存在,則直接返回訊息佇列id。

flag的值為 ipc_creat | ipc_excl:如果不存在key值的訊息佇列,且許可權不為0,則建立訊息佇列,並返回乙個訊息佇列id。如果存在,則產生錯誤。

返回值:成功返回訊息佇列id;出錯返回-1

例如:i

所需標頭檔案#include

函式原型int msgsnd(int msgid,const void *ptr,size_t nbytes,int flag);

msgid:為msgget返回的訊息佇列id值

ptr:為訊息結構體mymesg指標

nbytes:為訊息結構體mymesg裡的字元陣列mtext大小,sizeof(mtext)

flag:值可以為0、ipc_nowait

為0時,當訊息佇列滿時,msgsnd將會阻塞,直到訊息能寫進訊息佇列或者訊息佇列被刪除。

為ipc_nowait時,當訊息佇列滿了,msgsnd函式將不會等待,會立即出錯返回eagain

返回值:成功返回0;錯誤返回-1

例如:msgsnd(id,(void *)&ckxmsg,512,0);

所需標頭檔案#include

函式原型ssize_t msgrcv(int msgid,void *ptr,size_t nbytes,long type,int flag);

msgid:為msgget返回的訊息佇列id值

ptr:為訊息結構體mymesg指標

nbytes:為訊息結構體mymesg裡的字元陣列mtext大小,sizeof(mtext)

type:在結構體mymesg裡我們定義了乙個long int mtype,用於分別訊息的型別

type ==0 返回佇列中的第乙個訊息

type > 0 返回佇列中訊息型別為type的第乙個訊息

type 

flag:可以為0、ipc_nowait、ipc_except

為0時,阻塞式接收訊息,沒有該型別的訊息msgrcv函式一直阻塞等待

為ipc_nowait時,如果沒有返回條件的訊息呼叫立即返回,此時錯誤碼為enomsg

為ipc_except時,與msgtype配合使用返回佇列中第乙個型別不為msgtype的訊息

返回值:成功返回訊息資料部分的長度;錯誤返回-1

例如:msgrcv(id,(void *)&ckxmsg,512,1,0);

簡單的操作就是刪除訊息佇列了,也可以獲取和改變訊息佇列的狀態

所需標頭檔案#include

函式原型int msgctl(int msgid, int cmd, struct msqid_ds *buf);

msgid就是msgget函式返回的訊息佇列id

cmd有三個,常用刪除訊息佇列的為ipc_rmid;ipc_stat:取此佇列的msqid_ds結構,並將它存放在buf指向的結構中;ipc_set:改變訊息佇列的狀態,把buf所指的msqid_ds結構中的uid、gid、mode複製到訊息佇列的msqid_ds結構內。(核心為每個訊息佇列維護著乙個結構,結構名為msqid_ds,這裡就不講啦,裡面存放著訊息佇列的大小,pid,存放時間等一些引數)

buf就是結構體msqid_ds

返回值:成功返回0;錯誤返回-1

例如:msgctl(id,ipc_rmid,null);刪除id號的訊息佇列

下面為乙個簡單的程式,乙個service和乙個client,service往訊息佇列裡寫資料,client從訊息佇列裡讀資料,當service輸入quit時刪除訊息佇列,並且倆程式都退出。

1.service.c

#include#include#include#include#includestruct mymesg;

int main()

while(1)

if(strncmp(msg,"quit",4) == 0)

break;

} if(msgctl(id,ipc_rmid,null) < 0)

return 0;

}

2.client.c

#include#include#include#include#includestruct mymesg;

int main()

while(1)

printf("data:%s\n",ckxmsg.mtext);

if(strncmp(ckxmsg.mtext,"quit",4) ==0)

break;

} return 0;

}

執行結果

Linux 訊息佇列程式設計

訊息佇列 訊號量以及共享記憶體被稱作 xsi ipc,它們均來自system v的ipc功能,因此具有許多共性。鍵和識別符號 核心中的每一種ipc結構 比如訊號量 訊息佇列 共享記憶體 都用乙個非負整數的識別符號加以標示 如共享記憶體的shmid 訊號量的semid 以及訊息佇列的msgid 不同於...

訊息佇列程式設計

訊息佇列 就是乙個訊息的鍊錶。而一條訊息則可看作乙個記錄,具有特定的格式。程序可以向中按照一定的規則新增新訊息 另一些程序則可以從訊息佇列中讀走訊息 傳送訊息佇列 include include include include struct msgt int msg type char str 25...

訊息佇列程式設計收發資料

1.server.c include include include include include 用於建立乙個唯一的key 訊息結構 struct msg form int main 列印key值 printf message queue server key is d.n key 建立訊息佇列...