|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、概念- I8 K. L, e: u0 d: @ p- B0 ?6 a
, w, y! q. S R' H' l1 U ~0 T 消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;有读权限的进程则可以读走消息。读走就没有了。消息队列是随内核持续的。 只有内核重启或人工删除时,该消息才会被删除。在系统范围内,消息队列与键值唯一对应。
- p& s8 `3 p+ ^' Z9 T5 t7 _% z N& x; J, b1 {- H/ Y
二、步骤及思路4 s- w9 M- _* i1 m# J$ h
$ t3 y# S- F7 A( z3 {( C! m0 ?
1、取得键值
1 }0 k- s3 ?+ C. \) T; X6 f! T0 t/ `1 E1 u/ Z" n( z; z
2、打开、创建消息队列# x- [* V: m1 ~; l! Y" m+ T$ v
- d; N/ ^1 G1 D# z, P/ |- y3、发送消息
|& Q8 @+ @; b; m4 r, D; a! ^3 [# ?0 b0 r/ O0 v
4、接收消息2 ^' W8 V3 X& N/ T; m, Y+ j2 z
5 T, g; M- U& U1 `, m9 g
下面具体看看:* G# R( r; A- ~$ h7 ^2 l2 @( F
' {: q4 \2 D* b9 J# {% a/ [9 g1、取得键值+ [, U( M& ~4 g6 ~; k( b
- D( O. J H" E! F+ u) F$ J
key_t ftok(char *pathname, char proj)( m. M* A1 W% r; L: h% [7 f* s$ P
9 N8 ?. P" I/ Y5 O! m8 w 7 Z$ j! `- ^& _6 H0 b [0 {9 N
2 j; I) J# ~! h1 k+ r6 H8 F
头文件为<sys/ipc.h>。返回文件名对应的键值,失败返回 -1。proj是项目名,随便写,不为0就行。
8 Q4 ^) t2 `$ A8 E; r
- M0 F- `6 ]* u5 |" y fname就是你指定的文件名(已经存在的文件名)。需要有-t 的权限,或用root权限执行,通常设为/tmp或设为" . "。这里我感觉不用这个函数也行,因为key值可以自己指定,例如: #define KEY_MSG 0x101$ U! p; d2 L3 Q
8 U& }3 X0 G1 U/ X) S# z2、打开、创建消息队列
# Y ^( B4 F4 q: v+ _, d
4 m5 U1 |! {8 u& u6 l int msgget(key_t key, int msgflg)8 [" _& X" n. a6 z K% Q& j& q
, o7 e8 j5 T! _, ~
0 n& n. M. O3 H7 t/ c
头文件为<sys/msg.h>。key由ftok获得。
; I; N" Y! a* ~0 }- z" i/ U# F
$ Z$ M0 \9 K$ L; F t0 b& P0 o msgflg有:
* V( E5 C; F2 c) B2 H. h6 A
0 Z( S7 K: h: v) NIPC_CREAT 创建新的消息队列,应配有文件权限0666。
6 |8 h# h6 y3 ^* W, p# s6 q. Z7 o* x' s6 M+ w1 A& j
IPC_EXCL 与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误。
+ ^: B6 |/ Q( ~; m- O- \: ~: k$ i, h+ K* C- T; S% x1 H( ?3 e* a% \
IPC_NOWAIT 读写消息不阻塞。
$ G5 |9 A; G9 v7 x7 s. U- \* r& q" f; p
) d3 r' E( ]" D: M 当没有与key相对应的消息队列并且msgflg中包含了IPC_CREAT标志 或 key的参数为IPC_PRIVATE 时,创建一个新的消息队列。
+ k* ^5 V0 h) N+ K$ n6 F& Y5 C9 M/ K2 l; }6 K( w) [
3、发送消息
# [8 e! M7 v; K. H9 z* z) L% K! C, T9 U# o6 p, T/ s8 L0 Q1 K
* f8 k% T2 M$ k4 C% Y1 I$ o6 k
% U9 @, }# h, V
- A- \$ R+ {2 ]% n |
|