进程间通信之消息队列
嘿,你有没有想过,为什么进程间通信的消息队列这么火?其实啊,它就像一个“快递小哥”,把消息从一个进程送到另一个进程,而且还是“异步”的,意味着你不用一直等着对方接收。听起来是不是很酷?
首先,咱们得知道消息队列是什么。简单概括,它就是一个存放消息的“容器”,独立于发送和接收的进程,像是一个“消息中转站”。你可能会问,为什么要用它?比如你有一个高并发的系统,直接调用可能会卡死,而消息队列能帮你解耦,让系统更灵活。
那怎么用呢?别急,咱们一步步来。首先,你得用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