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

Linux进程——消息队列

[复制链接]

该用户从未签到

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

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 ]
}   

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 21:15 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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