> 文章列表 > 进程间通信之消息队列

进程间通信之消息队列

嘿,你有没有想过,为什么进程间通信的消息队列这么火?其实啊,它就像一个“快递小哥”,把消息从一个进程送到另一个进程,而且还是“异步”的,意味着你不用一直等着对方接收。听起来是不是很酷?

首先,咱们得知道消息队列是什么。简单概括,它就是一个存放消息的“容器”,独立于发送和接收的进程,像是一个“消息中转站”。你可能会问,为什么要用它?比如你有一个高并发的系统,直接调用可能会卡死,而消息队列能帮你解耦,让系统更灵活。

那怎么用呢?别急,咱们一步步来。首先,你得用ftok函数生成一个独一无二的key,这不就是给消息队列起个“门牌号”嘛!接着,msgget创建消息队列,msgsnd发送消息,msgrcv接收消息,最后别忘了msgctl删除队列。你看,操作起来就像快递小哥的“送件、收件、签收”流程,清晰明了。

不过,用消息队列也得注意点。比如,消息队列会一直存在,除非你手动删除,不然它就像个“幽灵”一样占用系统资源。所以,用完了记得“打扫战场”。

概括来讲,,消息队列是个好东西,能让你的系统更高效、更稳定。但用的时候也得悠着点,别让它成了你的“负担”。怎么样,是不是觉得进程间通信也没那么复杂?

进程间通信之消息队列

消息队列

  • 一. 什么是消息队列
  • 二. 消息队列有关函数
    • 1.获取key - ftok
    • 2.创建消息队列 - msgget
    • 3.发送消息 - msgsnd
    • 4.接收消息 - msgrcv
    • 5.删除消息队列 - msgctl
  • 三. 实例
    • 注意:

一. 什么是消息队列

消息队列独立于发送消息的进程和接收消息的进程,消息队列是消息的链表,存放在内核中并由消息队列标识符标识。
每个消息队列都有一个标识,只有持有这个标识的进程才可以去里面拿消息生命周期随内核,消息队列会一直存在,需要我们调用接口删除或使用命令删除

进程间通信之消息队列

二. 消息队列有关函数

1.获取key - ftok

功能 : 获取一个独一无二的key,作为传给共享内存的一个参数

#include <sys/types.h>
#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
key_t key = ftok("./read", 'a');
pathname:提前创建的可访问文件的文件名,可以随意写
proj_id:任意一个字符返回值:成功则返回生成的key值,失败则返回-1

2.创建消息队列 - msgget

功能 : 创建消息队列

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgget(key_t key, int msgflg);
int msgget(key_t key,int msgf1g);
key:ftok得到的key值或者IPC_PRIVATE(创建私有的消息队列)
msgf1g:IPC_CREAT | 0664
返回值:成功: 返回消息队列id失败: 返回-1;

3.发送消息 - msgsnd

功能 : 发送消息

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgf1g);
smqid:创建或者打开消息队列得到的id号
msgp:是一个结构体指针,类型为struct msgbuf *,表示为发送消息结构体的首地址struct msgbuf {long mtype;       /* message type, must be > 0 */     类型char mtext[1];    /* message data */          	  	 数据};msgsz:消息正文内容的大小
msgf1g:0:阻塞方式发送IPC_NOWAIT:以非阻塞方式发送
返回值:	成功:0失败:-1

例如:

typedef struct msgbuf//定义消息结构体
{1ong mtype;char mtext[1024];
}MSG;
#define LEN (sizeof(MSG)-sizeof(long)) 		//计算消息正文内容大小MSG msg;	//定义消息结构体变量while(1)
{msg.mtype = 100;	//封装消息类型fgets(msg.mtext,1024,stdin);	//输入消息正文msg.mtext[str1en(msg.mtext)-1] = '\\O';msgsnd(id,&msg,LEN,O);	//发送消息
}

4.接收消息 - msgrcv

功能 : 接收数据

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>ssize_t msgrcv(int msgid, void *msgp, size_t ms