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

Linux进程——消息队列

[复制链接]

该用户从未签到

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

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
}   

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 22:41 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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