|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 M* m! K( Z$ S4 k
消息队列是消息的链接表,包括Posix消息队列system V消息队列。消息队列用于运行于同一台机器上的进程间通信,它6 o3 F, a- O# @# y2 d5 ?
和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了2 b6 J8 a) ?2 x2 Z$ `) u3 E
信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 我们可以用流管道或者套接口的方式来取代它。
: E6 o( [2 C) j) e0 ^" p5 D0 Y6 E: y& }
查询系统消息队列:ipcs -q' J9 B& O9 y, B! `
5 [' V& q& K& w8 Z' _
#include <sys/types.h>
3 j6 s$ Z# o! |* x2 J* c
4 }. P+ b* L! Y0 f, P6 C" ~1 L+ U5 A1 R#include <sys/ipc.h>' {! A( w: q) U. M$ Z
* }' {: m; U$ s
#include <sys/msg.h>* t3 H6 z" s# z$ B: f6 j
% p' H0 ^8 [6 }# ~% |. L4 a* \int msgctl(int msqid, int cmd, struct msqid_ds *buf);
, J; O% h) s! r, o2 w, C, G' E% z4 o; F5 V0 K T. m
int msgget(key_t key, int msgflg);7 f H6 @( |2 w0 h: R/ d$ n p
: q& t1 ]$ Y+ D; d: X2 @/ [
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
" ]( ?! L. Q; q% K& q+ G: G5 C% t! e
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
* a' Z5 g1 n, H8 e K2 G* @7 j5 K, q' a; n
0 F. C0 m) \: u1 q! A
' H2 m; I. z; V5 F4 }/ {; ?
C代码
) C {& ^! i& \5 x' n0 F6 p- Z" U" U/*msgserver.c*/
& h" b2 Z3 N7 z5 s2 r0 e
( g' j; r& W+ m5 j8 ]#include <stdlib.h>
$ D" j- Y6 r3 E n#include <string.h> $ o% a6 n) o/ P& f5 ]
#include <errno.h>
[. A p) p: W6 T1 p#include <sys/types.h>
. s% m1 _% N! S6 E( f' r; U#include <sys/ipc.h>
) ?) w# X6 h8 e+ |3 z3 q#include <sys/msg.h> , ~* T# S; b& p
#include <sys/stat.h> 3 ^1 c/ l$ C% @ O9 Y
' ]) ?, c) D: ?9 H: v b; D#define MSG_FILE "msgserver.c" 7 C; G; |1 G0 C6 W+ `3 |
#define BUFFER 255 ) x" ?* |) C$ Z _) r+ a
#define PERM S_IRUSR|S_IWUSR 8 Z0 X# Z( t2 h
/* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */
2 \) e" r* ?& w0 `5 }6 A/* ipcrm -q <msqid> */ 0 D* @1 d$ r) X( W) S
5 ]4 h8 Q* b) t' ^
struct msgtype * q7 K- u4 |3 o8 F* i! |3 X
{
( m) b7 z9 e$ f9 v long mtype; . W+ l1 |9 h7 A; M6 @
char buffer[BUFFER+1]; , F- p# {2 Z+ @$ G' q. }8 s4 u; e
}; & h- i7 }6 t" s
, X# K, O5 K) F, h6 y# l
int main()
7 p/ ?$ h1 I6 W0 F% A& m{
4 a3 ^( M% x) a" ` struct msgtype msg; & r3 ?/ Q2 j2 s. i+ h. Q D
key_t key; s, \ P6 y8 [2 X
int msgid; " C' R* F8 T7 h6 P
% @# v" l" `" f& b if((key=ftok(MSG_FILE,'a'))==-1)
9 Z6 p$ U3 g$ u2 @7 y {
) c- u7 N& \8 C: } fprintf(stderr,"Creat Key Error:%s\n", strerror(errno)); 4 b6 H2 Y; ~4 n b- p
exit(1); + d1 [; ~( j$ v3 q0 t5 R
} 7 V9 Z: @, J6 Z- s9 J+ m' X+ s2 d
' Z- A/ d6 M, I" B; e9 z7 u% f
if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)
* \# I: _8 M0 h {
. H8 z7 k4 E9 Y% M fprintf(stderr, "Creat Message Error:%s\n", strerror(errno));
3 T. K, O3 ]. ~6 m exit(1);
" Q* n, q, C) C1 O i+ l3 ?: H }
( a1 v- P8 C7 ]8 d; R5 d% a printf("msqid = %d\n", msgid); s: `* m2 f {( R% j9 V. W G
while(1) 8 \) V% V4 v3 x1 G9 h, @% \
{ 9 j. C7 q3 g$ e' ~" G
msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);
; ~2 ^9 L# A( }8 D4 ?% D fprintf(stderr,"Server Receive:%s\n", msg.buffer);
5 Z) R( J! v! T. r4 X8 J msg.mtype = 2; # p. p' b8 P7 Z- Y/ S% Q0 x
msgsnd(msgid, &msg, sizeof(struct msgtype), 0); h+ u- _! \ L A$ _) s
} * Y: e! h. r! L8 P+ j. j
exit(0);
5 V3 `; [4 g2 M}
, m# L) n7 n& c2 C1 V; e6 TC代码% G5 u* `4 {8 L' B2 e
/* msgclient.c */
) l6 F/ o4 r" i, ?( b
0 j0 O/ s- u2 o7 c" u) t#include <stdio.h> 2 r- [/ a& U1 C# w
#include <stdlib.h> g! q- H9 Z& H8 E, N& u P1 s
#include <string.h> 0 _7 x2 W$ X; D/ i9 k Q: Z
#include <errno.h>
' Z, v& L( m6 s+ Z#include <sys/types.h> 6 s- D1 l* o& n$ R$ U" l
#include <sys/ipc.h> " P5 \5 c0 |2 q" W2 Q0 c* \' D
#include <sys/msg.h> 7 r: i( }. a8 k3 M3 c; w" ?! a
#include <sys/stat.h> 1 F" h g, c5 ^" r) _% O9 C" g- P
' F1 z# b1 q" m#define MSG_FILE "msgserver.c"
9 |% L8 Z( k& N#define BUFFER 255 ! v% v/ {- o) A; v7 |0 ]( M6 T9 g0 V
#define PERM S_IRUSR|S_IWUSR
2 d7 b0 N* g9 m6 v& J6 D1 U
& F7 P4 V4 J) p- K1 Nstruct msgtype { 3 E+ {' a, I: W: K0 C8 k
long mtype; * I* ]$ O* C' y# V* m
char buffer[BUFFER+1]; 7 i* W# `' f/ G, W# N$ e5 x. U. u
};
& Q1 ]- Y/ H7 s9 u 8 d/ j5 ~$ m O& L" e& W
int main(int argc, char **argv)
0 X- Z; X) B5 D6 h) F# O _3 n{
" A8 @: |) R6 ]# L' h# x! S/ u struct msgtype msg;
1 b; I* N) [, L) p. D3 T key_t key;
5 ^+ q( r/ p& } int msgid;
8 ]+ b5 q6 o; M' U7 m- r& N5 f6 C
0 s4 S; T' g3 z3 p if(argc != 2) y! l0 d4 d0 {1 Z
{ ; _. j; F- E/ s
fprintf(stderr,"Usage:%s string\n", argv[0]); ' e' v! B8 L! f
exit(1); ( U/ X" r7 l8 T% X: f
} - o# f. R8 e( _' B" x
' l S; C0 v3 O* B/ E1 l
if((key=ftok(MSG_FILE,'a'))==-1) ; t* U$ D' N' d# }; h
{ 4 Y& i6 T7 j. N; D0 l1 k
fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));
0 ]; P1 K. M4 H exit(1); 3 w2 d( k- M# m: M
} i; g: N( c. Z | p
& Y" B0 N% `0 c# x* \3 q
if((msgid=msgget(key, PERM))==-1) 9 e6 O2 U! K3 f: I
{ * e1 K& b; W2 q L2 q' B, [6 ^9 W
fprintf(stderr,"Creat Message Error:%s\n", strerror(errno)); 1 o' b$ [- [; t" Q7 \- O. L
exit(1);
$ ^# d9 Y2 O' B R9 u3 f }
; P) y P8 ~* t! D1 r5 r8 q ; j% P8 Z# v+ c1 S
msg.mtype = 1; 7 F- F7 g- D2 ?' o
strncpy(msg.buffer, argv[1], BUFFER);
/ B$ M9 ~1 S, m" ` msgsnd(msgid, &msg, sizeof(struct msgtype), 0);
- S. d6 [. g$ ? memset(&msg, '\0', sizeof(struct msgtype)); 4 t Q/ W& x* D6 s8 d# z
msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0); 1 _ H0 v9 a3 Q3 v/ D
fprintf(stderr, "Client receive:%s\n", msg.buffer); " ]! l0 C6 _9 j
exit(0); $ w: A7 e. n* [" s9 }$ A: X+ b+ m8 q
} |
|