|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* x4 x0 [/ {8 M( Z) C. p消息队列是消息的链接表,包括Posix消息队列system V消息队列。消息队列用于运行于同一台机器上的进程间通信,它
$ \6 [9 g& S9 C7 o和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了* d M, \5 b1 |; [
信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 我们可以用流管道或者套接口的方式来取代它。
. e. I* y: [$ r- S" L! X) |( r* C0 @& T
查询系统消息队列:ipcs -q( B: U+ G( G0 c0 E
Z! x6 Q f7 ?6 O#include <sys/types.h>. x1 ^% j+ ~- |
3 c$ [: T2 u! ^4 s# F# m#include <sys/ipc.h>
; X! \% R# a3 S2 V1 ], A* o! i
! c. t3 O5 o( k#include <sys/msg.h>
) b( d }% ^6 a$ Y- ]
# r6 l- Y9 Z& P" ^int msgctl(int msqid, int cmd, struct msqid_ds *buf);
8 b" j* R2 E7 `4 r, L0 }5 u- w# I( i* e! ^
int msgget(key_t key, int msgflg);2 c& ^# ]2 H9 A0 T/ T k6 l/ M3 q
+ l( Y$ q: i# i: a( r$ _int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);: s7 i& C/ X# p3 X4 X' U6 h
; s! ^# r( h$ U, a3 ?8 U8 T& s5 F
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
) I9 H2 R# Q$ p" `8 }! d$ |$ _1 t; g, S7 |. r3 `
9 r- t% m4 \- }9 f/ v1 u! e) l3 Z% u
C代码! v2 T6 @9 p- G* X
/*msgserver.c*/ 4 q) z* E, B9 @7 C
" p' v3 g7 {' }$ Y#include <stdlib.h>
: e/ ^1 k; ^( J#include <string.h>
3 g1 K7 i# H- O D5 O. _7 w. z( h- v#include <errno.h> : x$ i4 z* q) d" v9 {; o. u
#include <sys/types.h>
% N6 \) j- J1 E/ c- h% s: O/ R* Y#include <sys/ipc.h> 6 U) J5 K' D4 u$ J3 F) K
#include <sys/msg.h>
* Y+ W2 e4 S1 h$ n7 H. ~. W; @+ d#include <sys/stat.h> ; `, m- r1 k ^- V# _$ A4 D: i! `
* P/ A+ \ Z- T0 M1 N# m
#define MSG_FILE "msgserver.c"
2 W& y" m" F" v. [4 Y#define BUFFER 255
( W% J! t: z }#define PERM S_IRUSR|S_IWUSR
% ?4 _/ B( E* k% D4 ?, K) s/* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */ ; G, [' {) g( f. Z
/* ipcrm -q <msqid> */ 9 {8 q! t2 q# F2 P) @
3 W; F M% D% P
struct msgtype
4 f, h* F9 A* p* u* h$ k{ * M: s, r, v# m; Q4 l+ k2 Y( k
long mtype; 5 d$ i5 F% ~- ~* x$ f* |$ f5 d. L
char buffer[BUFFER+1]; 6 o' k$ I4 w! v+ ~! Y! ]
}; ' E; Z$ M4 x+ g9 ~3 [2 o4 M
$ N/ k0 [! v$ I* K0 I6 C- Q7 g9 j
int main() ! |" y3 |/ B# E7 F: T6 k
{ ' Y4 l$ l q" E5 E" U, y$ i
struct msgtype msg;
3 H& Q8 C- J# y( e6 K key_t key; 8 ]* q% t' a1 Z6 R }
int msgid; 3 m( k& d5 |3 O* t/ k% ^( N; \
; B: s: a. ]$ U9 s2 B k' v if((key=ftok(MSG_FILE,'a'))==-1)
5 e) a3 Y; z/ Y+ K { 8 u" {- X& E/ E) A% h0 V
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
0 o n& T8 h* Q: B4 z exit(1);
+ e- L1 b# j" E1 o8 {3 B } 0 Q7 S; c, L4 v/ s" }4 {; j
' Y3 a$ `2 _; J9 Y
if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)
4 T) B2 y! l- g: M$ R- P H( s5 ? {
2 Y4 {; S% z8 K+ o* L' r: Q& A1 u m: v fprintf(stderr, "Creat Message Error:%s\n", strerror(errno));
" b2 z/ i d5 S/ D' e# m exit(1); ( `, c3 c& }" q
}
5 D7 f9 j+ X. ~5 z printf("msqid = %d\n", msgid); , {/ n) `) V# K. x) x2 m
while(1) # g9 t8 Q/ H/ I( c# A, t
{ / h" m, c" P# F9 I5 u$ A
msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0); . O9 I6 J% m$ J0 y9 F
fprintf(stderr,"Server Receive:%s\n", msg.buffer); - O* }8 I8 g, y( w& |$ y
msg.mtype = 2; . F% W! N, e' _1 G2 {5 T+ L
msgsnd(msgid, &msg, sizeof(struct msgtype), 0); ) u! T0 u1 [5 W" `( h, J8 @% g
} $ t8 U e5 b" G& ~- U* L
exit(0); 0 ?3 C+ |% K1 Z: Q9 g6 U
} 3 H$ R! x. ^( l
C代码! m* H/ k5 v# V p, Y0 w6 q
/* msgclient.c */
3 ^+ Z1 S# T; }' n8 x + `8 e! y% y9 t6 |: ?" S
#include <stdio.h>
( ~$ ~* H. `. y, m7 v#include <stdlib.h>
+ |$ U: E. A7 v, o8 k#include <string.h> ! W& l* [6 ^0 _/ i
#include <errno.h>
5 u2 K4 u0 u. C#include <sys/types.h> & E$ t8 z1 ]5 A7 b0 B) F' A
#include <sys/ipc.h>
4 m4 B1 N% V, I7 {! C$ V) s#include <sys/msg.h>
: L0 ~$ F2 q2 @7 k6 f# L#include <sys/stat.h> 4 n# q* F. g' Y* L
- v% i: i5 x' D( Q8 a# ^6 J. E#define MSG_FILE "msgserver.c"
. P* m& \: Q; C5 P) i. k#define BUFFER 255
8 S' f5 Z* y% F& y. y$ b" s#define PERM S_IRUSR|S_IWUSR
5 T- @3 z8 z: S* M6 l, e: R 3 _% E. h: I( D+ g" y9 U- N& V: C
struct msgtype { ) G ~5 K P p/ D0 J
long mtype; - f. k$ u$ Z' b \
char buffer[BUFFER+1];
- f. {- q% L, Q$ U5 a3 z5 I}; 0 l$ ?7 k T3 k. y- d
; }& w+ _; i4 Zint main(int argc, char **argv)
8 `% {2 F+ y9 M$ y{
9 w6 w: |7 `3 Y8 _ K struct msgtype msg;
5 j+ B) x! [2 a key_t key; ! e v4 F' a( \! p/ \' e6 n/ u1 b; K# u
int msgid; ( s8 C% I) @ W. E: I- {# Y
9 u/ L; i% Z3 Y1 s if(argc != 2)
: I e. a F8 T8 l( v) g2 f4 }: j# I { & @5 _2 |& k1 d: I. W
fprintf(stderr,"Usage:%s string\n", argv[0]);
" B, C1 q- ?% _9 J exit(1);
& l8 ?! l) g' L" b }
& }4 l7 D8 ~$ n. Q6 g
# Y' I# Z t" ~" a* M; E if((key=ftok(MSG_FILE,'a'))==-1) 9 e4 N+ H$ i/ s4 G: F' Q
{
. @* e+ U7 ^2 c& i8 i, ?9 e% A0 p6 P' o fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
: T# o3 \8 B) m& R( T exit(1); & ~ \1 E) t/ p7 p2 V7 Y" v
}
3 @( _3 k- j& `. m7 [& o9 n4 \! z
* N, @; X4 J% U4 ?' B if((msgid=msgget(key, PERM))==-1) 2 W' r8 a+ A% C1 F4 z9 B
{ $ K) b1 Z7 z& e' m
fprintf(stderr,"Creat Message Error:%s\n", strerror(errno)); 8 h4 L1 x* k3 y4 U) {
exit(1); 5 B% i: W9 j/ I) a/ I- n$ b
}
- m/ y7 B. N5 n! r3 f' i
7 I: P8 ]" _, m1 M msg.mtype = 1; ' \9 w$ i9 \( Z5 h- c2 z
strncpy(msg.buffer, argv[1], BUFFER); 9 N" O: h6 J0 x3 K
msgsnd(msgid, &msg, sizeof(struct msgtype), 0); 6 v0 D6 f( W0 a
memset(&msg, '\0', sizeof(struct msgtype));
: N; n) o9 f" Z0 F* p! X! o msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0); ) ] E" G4 u- v$ W" k' ~
fprintf(stderr, "Client receive:%s\n", msg.buffer);
* h: x1 _6 ~ V; a exit(0); . I$ W2 m$ ]) @8 b; \8 T
} |
|