LINUX訊息佇列實戰之一

2022-05-22 10:00:10 字數 2326 閱讀 6091

前言

能說能抄能論皆不算,能寫能打才是真功夫。

嘮叨反正我也是乙個孤獨的程式猿,多說一些奇奇怪怪的嘮叨也無妨,第一次寫訊息佇列,書本的東西和實戰很不同,根據實戰總結的一些注意事項會和大家分享,也敲打敲打自己,以後別總是想當然,要頭頂藍天,腳踩大地,做乙個能文亦能武的敦厚男人。

簡介訊息佇列是linux提供的一種便利的ipc機制,不具有任何血緣關係的程式可以通過訊息佇列進行便利的通訊:不同的程式通過同樣的key訪問同乙個訊息佇列,支援不同優先順序的訊息佇列,效率較高且使用便利。

訊息佇列常用的幾個api 

ftok:根據指定檔案和引數生成key

msgget:建立或者附加乙個訊息佇列

msgctl:獲取訊息佇列的資訊或者設定訊息佇列的引數

msgsnd:向訊息佇列中新增訊息

msgrcv:從訊息佇列獲取一條訊息

發訊息** 

#include

#include 

#include 

#include 

#include 

#include 

#include 

#include 

using

namespace std;

key_t key;

#define max_text 2000

//定義訊息收發結構體,第乙個成員必定為long型,用以儲存msgtype,第二個成員為char字串,長度可以自己定義

struct mymsg

;int main()

//printf("key %d\n", key);

//由於上面提到的原因,採用了指定乙個隨機key的方式進行建立,這次成功了

//msgget用法:返回值為訊息佇列id,第乙個引數為key值,指定key未ipc_private時將建立新的訊息佇列,無法建立時報錯

//第二個引數為flag,ipc_creat表示如不存在就建立新的訊息佇列,加上ipc_excl表示建立新的訊息佇列,無法建立時報錯,通常要加上操作許可權,比如0666

if(imsgid == -1)

cout << "

imsgid:

"<< imsgid << endl;

int ret = 0;

//獲取訊息佇列的屬性資訊,msgctl傳入ipc_stat和msqid_ds物件指標

msqid_ds info;

memset(&info, 0, sizeof(info));

ret = msgctl(imsgid, ipc_stat, &info);

if( ret == -1)

//下面是乙個失敗的嘗試,企圖將訊息佇列的大小擴大至6400000,但系統報錯了,先記錄下來

info.msg_qbytes = 6400000;

ret = msgctl(imsgid, ipc_set, &info);

if(ret == -1)

//linux下特有的支援,可以檢視訊息佇列的系統屬性,傳入ipc_info和msginfo,相關資訊將寫入msginfo

msginfo stinfo;

ret = msgctl(imsgid, ipc_info, (msqid_ds*)&stinfo);

if(ret == -1)

else

mymsg msg;

msg.mtype = 1;

memset(msg.mtext, 11, max_text-1);

msg.mtext[1999] = '

\0';

int count = 0;

while(count != 10000)

count++;

}getchar();

}收訊息**

#include

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

using

namespace std;

key_t key = 0x31a3852;

#define max_text 2000

struct mymsg

msg;

int main()

cout << "

msqid:

"<< msqid << endl;

int count = 0;

int ret = 0;

while(1)

else}}

小結訊息佇列使用比較簡單,但存在一些限制,僅憑道聽途說怕是不能真正掌握。 

linux訊息佇列 Linux訊息佇列

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

Queue訊息佇列實戰python

網上很關於queue的教程都只是個簡單的demo,看完也還是不知道怎麼在實戰中運用,下面的 是在用flask開發自動化測試平台時,用到的有關queue的 首先,在使用者介面所在的user.py檔案中匯入queue庫,並例項化為q 同時新建乙個thread子執行緒,這個執行緒提供功能是消費執行緒,可以...

linux訊息佇列

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