|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
0 @! t) }. f0 x4 W! g
消息队列是消息的链接表,包括Posix消息队列system V消息队列。消息队列用于运行于同一台机器上的进程间通信,它
! V% [- b& M4 f% f' `和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了
! \% Z5 h, t, U7 k; ^ b& h; E信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 我们可以用流管道或者套接口的方式来取代它。4 t( F' E' S0 V
" J K- h, G! ?" _- U8 \查询系统消息队列:ipcs -q6 U6 C/ {3 J3 Y
3 v8 @' k! j6 `7 S, l& F5 \" X#include <sys/types.h>
! z$ _ D9 K/ r. W8 z+ c( X. o. j7 q2 P( Z+ d9 n3 j2 O
#include <sys/ipc.h>; M$ Q, X$ k W$ V& d& z' g
5 T3 z8 d+ o+ w7 n: E& r
#include <sys/msg.h>
$ T0 r7 V+ a% G2 ]( p
; ^# c" L; g2 ^3 z5 h) O( _int msgctl(int msqid, int cmd, struct msqid_ds *buf);
1 e0 {& a: W" h5 h7 _2 B+ E6 p3 |. s- l- K+ F& \1 D
int msgget(key_t key, int msgflg);. v1 H* m, ^7 o3 s0 v6 e0 d# b
+ k1 O6 Q$ @/ J2 E
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);( r) S2 U% X4 s3 Y% B0 @
G' }: B* g N: x" |int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);0 V8 s+ h) N4 N" T7 p
& y, I- ^6 i- m) s9 l \# B
0 z6 t% J: M4 V! W1 g7 w
1 A3 ^1 P v, k# u% l1 O: i8 d1 AC代码
9 Q- {( ]# l4 u/ F! j; N8 w/ [) X/*msgserver.c*/
: b% T: q. l( K7 f" J O, I+ Z. i0 }% E: h9 i$ j; M, n8 v
#include <stdlib.h> + q" [& h7 U3 x* u( `6 C. G
#include <string.h>
) c( y0 f8 B2 c! ^+ R+ x$ Y#include <errno.h> 2 @, i l* R, C) l* _$ D( Z2 p
#include <sys/types.h>
; c* t9 {+ N+ {5 R1 o" r#include <sys/ipc.h>
1 j4 V/ i" ?% y$ ]5 u2 B9 y#include <sys/msg.h>
8 Q u, p" Y, g7 s+ h8 A#include <sys/stat.h> $ ^% c# L m% P4 q' ]) n
# Q( K0 e- E; E" v O$ O# Q#define MSG_FILE "msgserver.c"
" {( _& v$ E& M5 A. E- |#define BUFFER 255 6 `* [" f2 N: F, a% I% C7 t% v8 b
#define PERM S_IRUSR|S_IWUSR # x/ M" E# a+ p) s/ u4 {$ g+ h
/* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */ * ~' W+ N3 r' G& l9 j( @% V( S7 V
/* ipcrm -q <msqid> */ ; z3 i7 ?) m9 k4 p& }
) ^; D( O& U# z
struct msgtype
/ t( _: |2 G q+ e& z2 p3 m0 U+ g{
, h0 ~+ x. D' Q! Q& m long mtype;
8 L: }* Q) b& d6 c& \ char buffer[BUFFER+1]; ( c3 g+ J% E9 I5 w
}; 9 c' t0 J! S9 E4 b# F3 J3 P
0 Q; ?5 v K- ~# i% M" _
int main() 2 m8 ~; ?0 y5 d5 o
{ $ c4 Q, c, H# G: G8 u
struct msgtype msg; 5 X/ @2 R/ N2 ^4 |
key_t key;
; Q4 W9 z+ y. ~* w0 s" S int msgid;
2 k6 o2 S; ^1 T3 ]* W4 K
; o* o! e2 I" ^3 P if((key=ftok(MSG_FILE,'a'))==-1) $ [: V- b9 E0 k$ ?0 o
{ 2 E0 B% c' \# o# w
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno)); . Z( i! G! X$ [) h& B: P/ `6 z
exit(1); 8 c; U. K" w. w8 G/ w
} ]9 t ~9 X/ t' ~9 `/ W9 i% I
6 m* Q! e k/ y
if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1) , W) _3 A2 y) r- ~, d9 @
{
$ U. z- s$ `! v2 e6 ?1 h" H8 S fprintf(stderr, "Creat Message Error:%s\n", strerror(errno));
/ v: \5 S5 o. `: C+ W9 y exit(1);
+ Z/ E9 ]; q( t% U }
* _8 N' `8 r3 q9 ^ printf("msqid = %d\n", msgid);
: n( P, J+ Y! n# n( O while(1)
( ~$ e4 e) v! l7 Q) U* v: O: M; G { - O' N$ N3 y' t: j5 \, \
msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); 4 s. Z0 C& y. b1 e
fprintf(stderr,"Server Receive:%s\n", msg.buffer); 4 {/ U3 O( `! B$ i0 |
msg.mtype = 2; ( H& X, u! J3 n' Q& D9 C. L
msgsnd(msgid, &msg, sizeof(struct msgtype), 0);
" t) O, A9 Q5 ]! H } 9 l% N/ a0 a# g6 d& R# E
exit(0); 3 N" i5 {% P* r! j
} ! q6 Z U: V% v" u4 E4 z b7 R# L+ s
C代码) {- P! p6 s+ M; N
/* msgclient.c */
5 J4 h4 g* e* p+ m$ w/ i
, d5 |$ E# c9 X$ K#include <stdio.h> . b( W& M) @9 O6 t# q
#include <stdlib.h>
- R+ l. }: p1 q6 A( [8 t#include <string.h>
, o5 k8 A. R2 O: R#include <errno.h>
: r2 ], N& c& U$ V#include <sys/types.h> * Q: A2 r6 k% J; p, o! _9 L
#include <sys/ipc.h>
! O9 p( q5 _3 T) d9 a#include <sys/msg.h>
( y) R! e( s4 q" U#include <sys/stat.h>
3 E. ?( d- d0 |- a ' K$ C8 \, ?& J. B* U& D
#define MSG_FILE "msgserver.c" . l1 I! s# p! T" h& G
#define BUFFER 255
* ~6 V) g( f% _: e- [: w#define PERM S_IRUSR|S_IWUSR
* Z# Q/ g& T# i$ q , p. M, D+ O" Q; ^2 G! P3 _8 |
struct msgtype {
8 H" p; r8 ~% U4 R0 ?8 N long mtype;
' D. X9 E5 Q9 p( N- }/ j e9 Q/ K- ] char buffer[BUFFER+1];
; {) W5 t% j6 [3 o6 {};
* q! z, J4 E5 s S" x% y. g n" n: S& d, n+ H! |) X# S5 A
int main(int argc, char **argv)
: x' e* B, w4 U9 H% W{
! H' U9 Z& \0 h) ]7 }; | struct msgtype msg;
?- P# X8 H l$ Q0 N) Q key_t key; / P Z+ l# i/ L8 G
int msgid;
: R- a# y& e8 ~! g$ n
5 r0 l m6 u5 v! S0 v# O if(argc != 2) 8 Y8 [+ Z( f6 ~) K
{ 0 G g! \5 a6 \; P2 ~
fprintf(stderr,"Usage:%s string\n", argv[0]);
) S0 _0 Z4 D, O, O+ Z exit(1); ~+ O' r# P9 D- J
}
4 j3 @. C" `3 J( y1 N ; x) U! X' `& H# c9 |0 C/ u' M
if((key=ftok(MSG_FILE,'a'))==-1)
- `1 V5 r$ g; p9 ] { / w1 [2 ~8 v% k9 x
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
, ~9 a' s8 c4 ^) L7 b! e exit(1);
# [ p' Z2 m( g6 I+ V; B0 n } ) F/ c0 Z. l2 I$ M' Q/ W
8 Q0 E- u _9 U! O
if((msgid=msgget(key, PERM))==-1)
* |0 z; s, k0 I9 q {
# o* k/ I+ F: g' y2 g; h* `6 f- k fprintf(stderr,"Creat Message Error:%s\n", strerror(errno)); , t3 B, F$ A* _9 p$ U
exit(1); 7 g7 k* Z' a3 b
}
. M: i7 a+ y! Y0 A8 p! h& z / q# b. M# @" V8 A1 G
msg.mtype = 1; & Y5 a! _7 J2 k8 w# _5 k8 [
strncpy(msg.buffer, argv[1], BUFFER); . W' }( Y/ v0 ]' C8 e/ B
msgsnd(msgid, &msg, sizeof(struct msgtype), 0); / Q V* o- y1 |: P) {" H
memset(&msg, '\0', sizeof(struct msgtype)); ( F2 a6 m4 V; v/ p! g( G X
msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);
e) @9 k5 p+ Z* J' V& U1 u fprintf(stderr, "Client receive:%s\n", msg.buffer); $ m! X+ ^- Z& {8 {3 ~ u
exit(0); 3 b- u1 l" o& |0 ]
} |
|