LInux 之訊息佇列

2021-08-25 22:37:34 字數 2315 閱讀 5432

訊息佇列操作流程大概可以分為以下幾個步驟:

1、使用ftok()函式建立訊息佇列的key值:

//from /usr/include/sys/ipc.h

key_t ftok(const

char* path,int

id);

第1個引數為任意乙個檔名,第2個引數為任意id值。

2、使用函式msgget()建立訊息佇列id值:

//from /usr/include/sys/msg.h

int msgget(key_t key,int msgflag);

函式第1個引數為ftok()返回的鍵值,第2個引數為該訊息佇列的許可權,且msgflag的高位包含以下屬性項:

//from /usr/include/bit/ipc.h

#define ipc_creat 00001000 //如果key值不存在則建立

#define ipc_excl 00002000 //如果key存在,則返回失敗

#define ipc_nowait 00004000 //如果需要等待時,直接返回錯誤

3、使用msgctl()函式設定或獲取訊息佇列屬性:

//from /usr/include/sys/msg.h

int msgctl(int msgid,int cmd,struct msqid_ds* buf);

函式第1個引數為msgget()返回的訊息佇列識別符號,第2個引數cmd為執行的控制操作,包括以下選項:

//from /usr/include/linux/ipc.h

#define ipc_set 1 // 設定buf中的訊息佇列屬性

#define ipc_stat 2 // 獲取訊息佇列的屬性並儲存在buf中

#define ipc_info 3 // 獲取限制資訊

4、使用msgsnd()函式傳送訊息:

//from /usr/include/sys/msg.h

int msgsnd(int msgid,void* msg,size_t size,int msgflag);

函式第1個引數為訊息佇列識別符號,第2個引數為使用者定義的緩衝區,使用以下結構:

//from /usr/include/sys/msg.h

struct msgbuf

;

第3個引數為接收訊息的大小,第4個引數指定訊息達到系統界限時,要採取的操作,一般取ipc_nowait即如果需要等待,則函式立即返回錯誤。若設定為0,則表示函式將會一直阻塞。

5、使用msgrcv()函式接收訊息:

//from /usr/include/sys/msg.h

int msgrcv(int msgid,void* msg,size_t size,,long mtype,int msgflag);

函式引數同msgsnd()一樣,只是多了乙個mtype,表示要接收的訊息佇列型別。

以下是訊息佇列測試**,起動兩個程序,乙個不斷從終端讀取資料並傳送出去,另乙個程序不斷讀取訊息佇列內容,並列印出來,方式均為非阻塞

msg_send.c

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

struct msg

msg;

int main()

}return

0;}

msg_recv.c

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

struct msg

msg;

int main()

return

0;}

linux訊息佇列 Linux訊息佇列

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

Linux程序通訊之訊息佇列

訊息佇列主要由下面四個函式組成 1 msgget 2 msgctl 3 msgsnd 3 msgrcv 1 msgget 得到訊息佇列識別符號或建立乙個訊息佇列物件並返回訊息佇列識別符號 include include include intmsgget key t key,int msg 注意 這...

linux訊息佇列

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