一、概念
訊息佇列是由存放在核心中由訊息組成的鍊錶,由ipc id標識。使用者可以在訊息佇列中新增和讀取訊息。
特點:
1.訊息佇列提供的是一種帶有資料標識的特殊管道,因此可以選擇性的讀取資訊;
2.如果訊息佇列中有多條型別一樣的訊息,接收的時候只能按照先後順序接收(佇列特點);
3.如果你接收的訊息型別不存在,接收會阻塞。
1.建立ipc鍵值
建立ipc之前必須獲取乙個未使用的ipc鍵值(key);
#include
#include
key_t ftok
(const
char
*pathname,
int proj_id)
;引數:1.pathname必須是乙個已經存在的目錄
2.proj_id專案表符是乙個8位,1個位元組的值,通常用字母a,b表示。
2.獲取訊息佇列id
# include
# include
# include
intmsgget
(key_t key,
int msg***)
;引數:1.key,訊息佇列的鍵值,可以使用ftok獲得或者使用ipc_private
2.msg***可以為ipc_creat、ipc_excl、ipc_nowait或者三者的結果
1>ipc_creat:若核心中不存在指定佇列就建立它,第二個引數還需要與檔案許可權一起使用,例如
ipc_creat|
00666表示若核心中不存在指定佇列則建立它,同時程序可以對佇列訊息進行讀寫操作。;
2>ipc_excl:當與ipc_creat一起使用時,若佇列已存在則出錯(函式返回-
1)。
3.傳送訊息到訊息佇列中
# include
# include
# include
intmsgsnd
(int msqid,
const
void
*msgp, size_t msgsz,
int msg***)
;引數:1.訊息佇列的id
2.指向訊息緩衝區,傳送訊息必須把訊息打包成結構體
struct msg
;3.訊息的長度
4.message flag,可設定為0和ipc_nowait,標誌為*
*ipc_nowait*
*,表示msgsnd操作以非阻塞的方式進行,在訊息佇列中沒有可用的空間時,msgsnd操作會立刻返回。並指定eagain錯誤;
標誌為**0
**,表示msgsnd操作以阻塞的方式進行,這種情況下在訊息佇列中沒有可用的空間時呼叫執行緒會被阻塞,直到下面的情況發生:
4.從訊息佇列中讀取訊息
# include
# include
# include
intmsgrcv
(int msqid,
void
*msgp, size_t msgsz,
long msgtyp,
int msg***)
;引數1:msqid-訊息佇列的id
2:msgp-指向訊息緩衝區
3:訊息的大小
4:指定要從佇列中獲取的訊息型別,若取0,任意型別都接收
5.訊息佇列的刪除、屬性設定和獲取控制等操作
#include
#include
#include
intmsgctl
(int msgid,
int cmd,
struct msqid_ds *buf)
;引數1:msqid-訊息佇列的id
2:控制操作的命令,sus標準提供以下三個命令
**ipc_rmid*
*,刪除乙個訊息佇列。執行該命令系統會立刻把該訊息佇列從核心中刪除,該訊息佇列中的所有訊息將會被丟棄。
**ipc_set*
*,根據buf的所指的值來設定訊息佇列msqid_ds結構中的msg_perm.uid,msg_perm.gid,msg_perm.mode,msg_qbytes四個成員。
**ipc_stat*
*,通過buf返回當前訊息佇列的msqid_ds結構。
3.buf:指向msqid_ds結構的指
6.系統v訊息佇列的限制
系統範圍內的最大訊息數,在linux下這個限制由msgmnb*msgmni決定。
可以通過ipc_set來設定使用中的訊息佇列的最大位元組數。但是要在系統範圍內對核心限制進行修改,在linux下面可以通過修改**/etc/sysctl.conf核心引數配置檔案,然後配合sysctl**命令來對核心引數進行設定。
二、程式demon
傳送端
#include
#include
#include
#include
#include
#include
#define max 1024
struct msg
;int
main()
printf
("===misgid is %d\n"
,msgid)
;while
(running)if(
strncmp
(buffer,
"quit",3
)==0)
running=0;
}printf
("exit success");
exit
(exit_success)
;}
讀取資訊端
#include
#include
#include
#include
#include
#include
#include
#include
#define max 1024
struct msg
;int
main()
while
(running)
printf
("rcv data msg_type is %ld\n"
,data.msgtype)
;printf
("msg is :%s\n"
,data.msgdata);if
(strncmp
(data.msgdata,
"quit",4
)==0)
running=0;
}if(msgctl
(msgid,ipc_rmid,0)
==-1)
exit
(exit_success)
;}
執行結果:
程序間訊息佇列通訊
要保證server能夠接收client的訊息,就必須保證server的生成的msg的識別符號是一樣的,也就是兩個用的key是必須一樣的。msglucy.c include include include include include include include include include ...
程序間通訊(訊息佇列)
在嵌入式linux應用開發中,linux程序通訊的方式有6種,分別是管道 pipe 及有名管道 named pipe 訊號 signal 訊息佇列 msg 共享記憶體 shm 訊號量 和套接字 socket 在這我就簡單的描述一下程序通訊中的資訊佇列 msg 首先,訊息佇列的實現有重要的幾步 1 建...
程序間通訊 訊息佇列
有三種稱作xsi ipc的ipc 訊息佇列 訊號量以及 共享記憶體。它們只見有很多的相似之處。訊息佇列是訊息的鏈結表,儲存在核心中,由訊息佇列識別符號表示。它不同於管道,其生命週期是隨核心的。訊息佇列提供了 一種從 乙個程序向另 乙個程序傳送 乙個資料塊的 方法。每個資料塊都被認為是有 乙個型別,接...