linux本地消息队列使用方法,linux消息队列的使用

本文详细介绍了Linux内核中的消息队列机制,包括msgbuf和msqid_ds结构,以及msgget、msgsend和msgrcv等关键函数的使用。通过实例展示了如何在Linux环境下进行消息队列的创建、发送和接收操作,同时探讨了消息队列的限制和应用场景,如进程间通信。此外,还提到了消息队列在实际开发中的注意事项和限制,如消息的最大长度和队列的最大容量。
摘要由CSDN通过智能技术生成

消息队列

*消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容。消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识。

msgbuf结构

struct msgbuf{

long mtype; //消息类型

char mtext[1]; //消息数据

};

msgid_ds结构

struct msqid_ds{

struct ipc_perm msg_perm;

time_t msg_stime; //发送到队列的最后一个消息的时间戳

time_t msg_rtime; //从队列中获取的最后一个消息的时间戳

time_t msg_ctime; //对队列进行最后一次变动的时间戳

unsigned long __msg_cbytes; //在队列上所驻留的字节总数

msgqnum_t msg_qnum; //当前处于队列中的消息数目

msglen_t msg_qbytes; //队列中能容纳的字节的最大数目

pid_t msg_lspid //发送最后一个消息进程的PID

pid_t msg_lrpid //接收最后一个消息进程的PID

};

ipc_perm结构

struct ipc_perm{

key_t key; //函数msget()使用的键值

uid_t uid; //用户的UID

gid_t gid; //用户的GID

uid_t cuid; //建立者的UID

gid_t cgid; //建立者的GID

unsigned short mode; //权限

unsigned short seq; //序列号

};

键值构建ftok()函数

#include

#include

key_t ftok(const char *pathname, int proj_id);

//pathname必须是已经存在的目录

获得消息msgget()函数

#include

#include

#include

int msgget(key_t key, int msgflg);

/*第一个参数可以用ftok()函数生成

msgflg参数:

1.IPC_CREAT 如果内核中不存在该消息队列,则创建它

2.IPC_EXCL 当和IPC_CREAT一起使用时,如果队列早已存在则将出错

*/

发送消息msgsend()函数

#include

#include

#include

int msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg);

/*

第一个参数从msgget()获得

第二个参数指向一个消息缓冲区

第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)

第四个参数设置成0表示忽略,设置成IPC_NOWAIT,如果消息队列已经满了,则消息不写进队列中,如果不设置则阻塞直到可以写消息为止

*/

接收消息msgrcv()函数

#include

#include

#include

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

/*

第一个参数从msgget()获得

第二个参数消息缓冲变量的地址

第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)

第四个参数指定要从队列中获取的消息类型,内核查找队列中匹配类型的第一个到达的消息,如果传0则返回队列最早的消息,不管类型

第五个参数设置成IPC_NOWAIT,如果消息队列没有消息则返回ENOMSG,否则进程将阻塞直到满足条件的消息到达,如果客户等待消息的时候队列被删除则返回EIDRM,如果进程阻塞并等待消息的时候捕获信号则返回EINTR

*/

linux消息队列编程实例

转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...

LINUX消息队列实战之一

前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...

linux 消息队列的限制

消息队列的系统限制 作者:冯老师,华清远见嵌入式学院讲师. 消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制.第一:议个消息的最大长度:第二:消息 ...

linux消息队列通信

IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...

Linux消息队列应用

#include"sys/types.h" #include "sys/msg.h" #include "unistd.h" #includ ...

linux消息队列操作

对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...

Linux消息队列

#include #include #include #include

Linux 消息队列编程

消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数 ...

linux 消息队列

消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个... 那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@ 这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行 ...

随机推荐

qt 3 获取文件路径中的一部分

QList qlist = path.split(QRegExp("[\\\\/]")); QString FileName = qlist.at(q ...

try catch finally 关闭流标准的写法

平常开发中,都知道要在finlly里关闭流,但是有时finlly里代码不当,会引起另外的异常. 以下是看struts2源代码看到的,随手记录下. 有两点注意: (1)判断流是否为空. (2)filly ...

Cocos2d-x 3.2编译Android程序错误的解决方案

最近的升级Cocos2d-x 3.2正式版.iOS不管是什么程序编译问题,使用结果cocos compile -p android编译APK计划.结果悲剧,出现以下错误. Android NDK: I ...

如何让Mac、Windows可以互相远程

您可以通过Mac来远程Windows桌面:也可通过Windows来远程Mac界面:甚至还可以通过iOS或Android来远程Mac或Windows. Windows的操作方法,以Windows XP ...

关于ajax的跨域

在前端开发中,跨域是经常遇到的问题,也是面试最喜欢问的问题,究其根本原因,是浏览器的同源策略所致,是浏览器为了避免不同域名不能共享cookie以及locationstorage等等,发起请求的时候无法 ...

git 入门与应用

git可视化界面的项目版本控制软件,适用于git项目管理 SourceTree 安装方法 https://blog.csdn.net/qq_26230421/article/details/79921 ...

MySQL的安装与维护

一.数据库的基本概念 数据库: 以一定方式储存在一起.能为多个用户共享.具有尽可能小的冗余度的特点.是与应用程序彼此独立的数据集合. DBMS(DataBase Management System,数 ...

SeekBar的用法和自定义滑块的样式

SeekBar继承自ProgressBar,所以基本一样,我们自定义一般也就是顶一个滑块的图片而已. 布局文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值