linux 訊息佇列

2021-06-06 17:53:24 字數 4451 閱讀 1086

一、訊息佇列的基本概念

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

訊息佇列就是乙個訊息的鍊錶。就是把訊息看作乙個記錄,並且這個記錄具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以按照一定的規則新增新訊息;對訊息佇列有讀許可權的程序則可以從訊息佇列中讀出訊息。

linux採用訊息佇列的方式來實現訊息傳遞。這種訊息的傳送方式是:傳送方不必等待接收方檢查它所收到的訊息就可以繼續工作下去,而接收方如果沒有收到訊息也不需等待。這種通訊機制相對簡單,但是應用程式使用起來就需要使用相對複雜的方式來應付了。新的訊息總是放在佇列的末尾,接收的時候並不總是從頭來接收,可以從中間來接收。

訊息佇列是隨核心持續的並和程序相關,只有在核心重起或者顯示刪除乙個訊息佇列時,該訊息佇列才會真正被刪除。因此系統中記錄訊息佇列的資料結構 (struct ipc_ids msg_ids)位於核心中,系統中的所有訊息佇列都可以在結構msg_ids中中找到訪問入口。

ipc識別符號:每乙個i p c目標都有乙個唯一的i p c識別符號。這裡所指的i p c目標是指乙個單獨的訊息佇列、乙個訊號量集或者乙個共享的記憶體段。系統核心使用此識別符號在系統核心中指明 i p c目標。

ipc 關鍵字:想要獲得唯一的識別符號,則必須使用乙個 i p c關鍵字。客戶端程序和伺服器端程序必須雙方都同意此關鍵字。這是建立乙個客戶機/伺服器框架的第一步。在system v ipc機制中,建立兩端聯絡的路由方法是和i p c關鍵字直接相關的。通過在應用程式中設定關鍵字值,每一次使用的關鍵字都可以是相同的。一般情況下,可以使用f t o k ( )函式為客戶端和伺服器端產生關鍵字值。

二、ipcs 命令

命令ipcs用於讀取system v ipc目標的狀態。

ipcs -q: 只顯示訊息佇列。

ipcs -s: 只顯示訊號量。

ipcs -m: 只顯示共享記憶體。

ipcs –help: 其他的引數。

下面是ipcs命令輸出的例子:

[root@wanglong wanglong]# ipcs

—— shared memory segments ——–

key        shmid      owner      perms      bytes      nattch     status      

0×00000000 0          root      644        40         2                       

0×00000000 32769      root      644        16384      2                       

0×00000000 65538      root      644        268        2                       

—— semaphore arrays ——–

key        semid      owner      perms      nsems     

0×000000a7 0          root      600        1         

0×00000000 98305      apache    600        1         

0×00000000 65538      apache    600        1         

0×00000000 131075     apache    600        1         

0×00000000 163844     apache    600        1         

0×00000000 196613     apache    600        1         

0×00000000 229382     apache    600        1         

0×00000000 262151     apache    600        1         

0×00000000 294920     apache    600        1         

—— message queues ——–

key        msqid      owner      perms      used-bytes   messages

三、訊息佇列的主要呼叫

核心中實現訊息傳遞機制的**基本上都在檔案ipc/msg.c中,訊息佇列的主要呼叫有下面4個,這裡只作簡單介紹:

(1)msgget:呼叫者提供乙個訊息佇列的鍵標 (用於表示個訊息佇列的唯一名字),當這個訊息佇列存在的時候, 這個訊息呼叫負責返回這個佇列的標識號;如果這個佇列不存在,就建立乙個訊息佇列,然後返回這個訊息佇列的標識號 ,主要由sys_msgget執行。

(2)msgsnd:向乙個訊息佇列傳送乙個訊息,主要由sys_msgsnd執行。

(3)msgrcv:從乙個訊息佇列中收到乙個訊息,主要由sys_msgrcv執行。

(4)msgctl:在訊息佇列上執行指定的操作。根據引數的不同和許可權的不同,可以執行檢索、刪除等的操作,主要由sys_msgctl執行。

四、訊息佇列的應用例子

下面的例子很好的演示了建立、傳送、讀取、改變許可權以及刪除訊息佇列各種操作:

#include

#include

#include

#include

#include

#include

#include

#define max_send_size 80

struct mymsgbuf ;

void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text);

void read_message(int qid, struct mymsgbuf *qbuf, long type);

void remove_queue(int qid);

void change_queue_mode(int qid, char *mode);

void usage(void);

int main(int argc, char *argv)

switch(tolower(argv[1][0]))

return(0);

}void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text)

}void read_message(int qid, struct mymsgbuf *qbuf, long type)

void remove_queue(int qid)

void change_queue_mode(int qid, char *mode)

void usage(void)

程式儲存為 ipcs.c

編譯:gcc -o ipcs ipcs.c

程式執行結果解釋:

[root@wanglong wanglong]# ./ipcs  s  001  hello!

sending a message …

[root@wanglong wanglong]# ./ipcs  s  001  world!

sending a message …

[root@wanglong wanglong]# ./ipcs  s  001  you

sending a message …

[root@wanglong wanglong]# ./ipcs  s  001  and

sending a message …

[root@wanglong wanglong]# ./ipcs  s  001  me!

sending a message …

[root@wanglong wanglong]# ./ipcs  r  001

reading a message …

type: 001 text:hello!

[root@wanglong wanglong]# ./ipcs  r  001

reading a message …

type: 001 text:world!

[root@wanglong wanglong]# ./ipcs  r  001  

reading a message …

type: 001 text:you

[root@wanglong wanglong]# ./ipcs  d  001    /*刪除了訊息佇列001*/

[root@wanglong wanglong]# ./ipcs  r  001

reading a message ..                        ./* 因為刪除了,所以讀不出訊息了*/

linux訊息佇列 Linux訊息佇列

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

linux訊息佇列

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

linux訊息佇列

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