|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、概念
5 I- M3 P i( U8 \4 j: r# F4 ?5 Y
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;有读权限的进程则可以读走消息。读走就没有了。消息队列是随内核持续的。 只有内核重启或人工删除时,该消息才会被删除。在系统范围内,消息队列与键值唯一对应。
( a4 ` w# X. m" p% E& v' q' P* Z- Z: ^( G5 m! ?0 E
二、步骤及思路2 }8 Z# L, r0 T* ~% R \3 z
; E9 p V$ ?4 i/ Q1、取得键值
3 I- Z+ h# B$ m1 i- z
5 C3 M, H& `4 h: r; c2、打开、创建消息队列& h8 t( b( F) B- @# k& ?
7 f6 a# L- k1 V5 _* ?! x3、发送消息3 {# J6 i& m0 f; y0 C
8 b9 D& W3 K9 X6 s8 n, z9 }/ e3 j
4、接收消息
5 e0 O* A$ o4 x8 C% A/ y2 q, U$ ~/ b% i1 O
下面具体看看:
8 K$ @0 I. h7 K0 r# g- X% N R+ I* h4 g) B( H( j% ?
1、取得键值
) y7 I% z2 `4 \2 R+ l) K
: a$ G9 T9 ]; P5 z5 Z D key_t ftok(char *pathname, char proj)& P: b; U" v% j
# U! s. G- L5 Q; M. J' n
( E! h4 b: L- N: a& m" o
# R. N* q4 I; V) p; H' T% t
头文件为<sys/ipc.h>。返回文件名对应的键值,失败返回 -1。proj是项目名,随便写,不为0就行。
/ r8 f0 |3 b3 O `7 ~8 l8 | [1 ?9 f6 m w& O& t
fname就是你指定的文件名(已经存在的文件名)。需要有-t 的权限,或用root权限执行,通常设为/tmp或设为" . "。这里我感觉不用这个函数也行,因为key值可以自己指定,例如: #define KEY_MSG 0x101
u& Z9 g0 |$ g: z
7 _6 R+ x( c: U+ }3 c2、打开、创建消息队列" r4 b9 V4 G- s. }" [
- ]8 U/ N' Q9 j% D int msgget(key_t key, int msgflg)
4 m6 ?) ^% G: l- J" K' g8 _4 k% F( v) k, g9 y9 y5 Z
9 J; `& N# z% J! d/ d3 `. E, d
头文件为<sys/msg.h>。key由ftok获得。
P# n8 J( d- H2 q# ]: [1 ~. P$ _! ]; [" L$ k9 { n
msgflg有:5 m# ~, e; C* ~9 b* L/ F
, N/ c9 K4 U9 F n" z2 LIPC_CREAT 创建新的消息队列,应配有文件权限0666。
! `0 B4 f; s Q) v d! f0 ?3 l+ ]& q4 V' Q) y
IPC_EXCL 与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误。
2 E+ p, J, y5 H/ `$ I9 j7 L* c2 O' `+ v3 y6 J7 o* Q7 l1 o
IPC_NOWAIT 读写消息不阻塞。/ F' S. |0 }7 `* z5 F/ e
$ y6 B+ e) { D1 c6 Q
" O. r' @/ a- Q# ~; A 当没有与key相对应的消息队列并且msgflg中包含了IPC_CREAT标志 或 key的参数为IPC_PRIVATE 时,创建一个新的消息队列。5 {! X# }$ i% i3 B! p- a$ n1 ]6 M
# e' v0 ~4 ~: e% |( U8 Y3、发送消息' H# \# F3 U' G# b
% U9 j$ E0 l) C
. L% l6 v# {& K; d" R7 { t7 Y5 p! D5 h
+ v: A# T: u7 H# W+ X+ ]$ z, p
|
|