进程间通信【消息队列】

原理

在这里插入图片描述

代码

消息结构

struct msgbuf
{
	long mtype;//消息类型,必须大于0
	char mtext[1];//消息数据
}

头文件

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>

创建消息队列

int msgget(key_t key,int msqflg);
//int mssget((key_t)1234,IPC_CREAT|0600);
msgget()床创建或者获取一个消息队列
msgget()成功返回消息队列ID,失败返回-1
msqflg:IPC_CREAT

发送一条消息

msgsnd(int msgid,const void* msgsz,size_t msgsz,int msgflg)msgsnd()成功返回0,失败返回-1
msgsz:指定mtext中有效数据的长度
msgflg:一般设置为0,可以设置为IPC_NOWAIT

接收一条消息

 ssize_t msgrcv(int msgid, void *msgp, size_t msgsz, long msgtyp, int msgflg)msgrcv()接收一条消息
msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1
msgtyp: 指定接收的消息类型,类型可以为 0
msgflg: 一般设置为 0 可以设置 IPC_NOWAIT
size_t msgsz:接收消息的长度

控制消息队列

int msgctl(int msgid, int cmd, struct msgid_ds *buf);

msgctl()控制消息队列
msgctl()成功返回 0,失败返回-1
cmd: IPC_RMID

发送消息
在这里插入图片描述

接收消息
在这里插入图片描述
注意:在读取消息时,若是没有0号类型的消息,则0号消息表示可以随机读取任意类型的消息
在这里插入图片描述

面试

  • 进程间通信的方式有哪些?

管道、信号量、共享内存、消息队列、套接字

  • 共享内存的原理
    共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由 malloc 分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。
    共享内存不存在进程间的拷贝操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值