linux訊息佇列 Linux訊息佇列

2021-10-17 10:30:47 字數 2860 閱讀 3312

訊息佇列,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

所需標頭檔案#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 < 0 返回佇列中訊息型別值小於等於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時刪除訊息佇列,並且倆程式都退出。

linux訊息佇列

訊息佇列是核心位址空間中的內部鍊錶,每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,只需提供該訊息佇列的鍵值即可。1 訊息緩衝區結構 存放訊息資料的模板,可在基本定義的基礎上自己定義 在include linux msg.h中宣告,描述如下 struct 可以定義自己的例...

linux 訊息佇列

一 訊息佇列的基本概念 訊息佇列 也叫做報文佇列 是unix系統v版本中3種程序間通訊機制之一。另外兩種是訊號燈和共享記憶體。這些ipc機制使用共同的授權方法。只有通過系統呼叫將標誌符傳遞給核心之後,程序才能訪問這些資源。這種系統ipc物件使用的控制方法和檔案系統非常類似。使用物件的引用標誌符作為資...

linux訊息佇列

所謂訊息佇列就是指乙個訊息鍊錶。int msgget key t,int flag 建立和開啟佇列 int msgsnd int msqid,struct msgbuf msgp,size t msgsz,int flag 傳送訊息,msgid是訊息佇列的id,msgp是訊息內容所在的緩衝區,msg...