找回密码
 注册
关于网站域名变更的通知
查看: 335|回复: 1
打印 上一主题 下一主题

Linux进程——消息队列

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-3 10:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
}   

该用户从未签到

2#
发表于 2020-4-3 18:25 | 只看该作者
Linux进程——消息队列
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-26 02:16 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表