进程间通信——消息队列

一,什么是消息队列**
消息队列(System V标准)提供了一种从一个进程向另一个进程发送一个有类型数据块的方法。每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。支持双向通信。

二 ,在Linux中使用消息队列

1.创建新的消息队列或取得已存在的消息队列 megget()

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);


key:可以认为是一个端口号,可以由函数ftok生成。
msgflg:
IPC_CREAT   如果IPC不存在,创建一个IPC资源,否则打开操作。
IPC_EXCL    如果在共享内存不存在时,新的内存建立,否则产生错误。
IPC_EXEL    本身没什么意义,一般和IPC_CREAT连用用来保证对象为新建的,而不是已有的对象。

2.向队列读/写消息msgsnd() , msgrcv()
msgrcv() 从队列中取得消息:szie_t msgrcv(int msqid,void *msgp,size_t msgsz , long msgtyp,int msgflg);
msgsnd()将数据放在消息队列中:int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);

参数说明:
msqid:消息队列的标识码
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接受的消息,是一个用户可定义的通用结构。
msgsz:消息的大小
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:为0时,是阻塞方式等待。

3.设置消息队列属性msgctl()
int msgctl(int msgqid ,int cmd ,struct msqid_ds *buf);

参数说明:
cmd是将要采取的动作,它可以取3个值,
    IPC_STAT:把msgid_ds结构中的数据设置为消息队列的当前关联值,即用消息队列的当前关联值覆盖msgid_ds的值。
    IPC_SET:如果进程有足够的权限,就把消息列队的当前关联值设置为msgid_ds结构中给出的值
    IPC_RMID:删除消息队列

buf是指向msgid_ds结构的指针,它指向消息队列模式和访问权限的结构。msgid_ds结构至少包括以下成员:
struct msgid_ds  
{  
    uid_t shm_perm.uid;  
    uid_t shm_perm.gid;  
    mode_t shm_perm.mode;  
};  
成功返回0,失败返回-1.

4.消息队列控制指令
查看系统消息队列 ipcs -q
删除系统消息队列 ipcrm -q megid

三 ,使用消息队列进行进程间通信

comm.h
这里写图片描述**

server.c
这里写图片描述

client.c
这里写图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值