linux 声明消息函数,linux消息队列函数--解析

#include www.2cto.com

---------------------------------------------------------------------

1、系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。

ftok原型如下:

key_t ftok( char * fname, int id )

fname就时你指定的文件名,id是子序号。

在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。

如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16 进制为0x26,则最后的key_t返回值为0x26010002。

查询文件索引节点号的方法是: ls -i

当删除重建文件后,索引节点号由操作系统根据当时文件系统的使用情况分配,因此与原来不同,所以得到的索引节点号也不同。

如果要确保key_t值不变,要目确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t 值,比如:

#define IPCKEY 0x111

char path[256];

sprintf( path, "%s/etc/config.ini", (char*)getenv("HOME") );

msgid=ftok( path, IPCKEY );[/code]

同一段程序,用于保证两个不同用户下的两组相同程序获得互不干扰的IPC键值。

由于 etc/config.ini(假定)为应用系统的关键配置文件,因此不存在被轻易删除的问题——即使被删,也会很快被发现并重建(此时应用系统也将被重起)。

ftok()的设计目的也在于此。

----------------------------------------------------

2、int msgget(key_t key, int msgflg); //创建消息队列

参数:

key:消息队列关联的键。为IPC_PRIVATE时表示创建自己的消息队列

msgflg:消息队列的建立标志和访问权限。msgflg 的低位用来确定消息队列的访问权限。

IPC_CREAT:如果 key不存在,创建

IPC_EXCL:如果 key 存在,返回失败

IPC_NOWAIT:如果需要等待,直接返回错误

如果单独使用IPC_CREAT,则msgget()要么返回一个新创建的消息队列的标识符,要么返回具有相同关键字值的队列的标识符。如果 IPC_EXCL和IPC_CREAT一起使用,则msgget()要么创建一个新的消息队列,要么如果队列已经存在则返回一个失败值-1。

返回说明:

如果成功,返回消息队列标识符

如果失败,则返回-1:errno=EACCESS(权限不允许)

EEXIST(队列已经存在,无法创建)

EIDRM(队列标志为删除)

ENOENT(队列不存在)

ENOMEM(创建队列时内存不够)

ENOSPC(超出最大队列限制)

www.2cto.com

举例:

msgid=msgget(IPC_PRIVATE,IPC_CREAT|IPC_EXCL|00666); //创建消息队列

--------------------------------------------------

3、int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); //将消息送入消息队列

参数:

msqid:消息队列的标识符。

msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下

struct msgbuf {

long mtype;     /* 消息类型,必须 > 0 */

char mtext[1];  /* 消息文本 */

};

msgsz:消息的大小。

msgflg:用来指明进程在队列数据满(msgsnd)或空(msgrcv)的情况下所应采取的行动。

如果设置为 IPC_NOWAIT,则在消息队列已满时不发送消息并且调用进程立即返回错误信息EAGAIN。

如果设置为 0,则调用进程阻塞直至消息队列不为满。

返回说明:

成功执行时,msgsnd()返回0, 失败返回-1

举例:msgsnd(g_msg_id,&msg_snd,sizeof(msg_snd.msg_item),IPC_NOWAIT); //非阻塞发送消息

----------------------------------------------------------

4、ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); //从消息队列读取信息

参数:

msgtyp:

msgtyp = 0:收取队列中的第一条消息,任意类型。

msgtyp > 0:收取第一条 msgtyp 类型的消息。

msgtyp < 0:收取第一条最低类型(小于或等于 msgtyp 的绝对值)的消息。

其他参数参考msgsnd函数。

返回说明:

成功执行时,msgrcv()返回0, 失败返回-1

举例:msgrcv(msgid,&msg_rbuf,sizeof(msg_rbuf.msg_item),10,0); //阻塞接收

www.2cto.com

----------------------------------------------------------

5、int msgctl (int msqid, int cmd, struct msqid_ds *buf); //消息队列属性控制

参数:

msqid:消息队列的标识符。

cmd:执行的控制命令,即要执行的操作。包括以下选项:

IPC_STAT:读取消息队列属性。取得此队列的msqid_ds 结构,并将其存放在buf指向的结构中。

IPC_SET :设置消息队列属性。

IPC_RMID:删除消息队列。

IPC_INFO:读取消息队列基本情况。此命令等同于 ipcs 命令。

这 4 条命令(IPC_STAT、IPC_SET、IPC_INFO 和 IPC_RMID)也可用于信号量和共享存储。

buf:临时的 msqid_ds 结构体类型的变量。用于存储读取的消息队列属性或需要修改的消息队列属性。

举例:msgctl(qid, IPC_RMID, NULL)  //删除消息队列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs自拉软件全名_vs全新操作软件说明书

VS2010全新操作软件说明书———功能更强大与操作简单并无冲突欢迎使用VS2010全新操作软件&#xff0c;目前该软件支持得控制卡型号有VSA系列、VSD卡、VS-mini卡、VSC卡&#xff0c;暂时不支持VSB卡&#xff0c;请勿在VSB卡上更新VS2010软件。在VSA系列得控制卡中&#xff0c;也…

[android] 手机卫士手机定位的原理

手机定位的三种方式&#xff1a;网络定位&#xff0c;基站定位&#xff0c;GPS定位 网络定位&#xff0c;手机连上wifi 2g 3g的时候&#xff0c;手机会有一个ip&#xff0c;误差很大 基站定位&#xff0c;精确度与基站的多少有关&#xff0c;几十米到几公里的误差 GPS定位&…

antd table设置表格一个单元格的字体颜色_alireacttable:高性能 React 表格组件

点击上方蓝字关注我们简介在前端开发中&#xff0c;表格一直都是最复杂的组件之一。表格不仅要支持丰富的操作(排序、过滤、搜索、分页、自定义列等)&#xff0c;还要有非常好的性能以展示大量数据。很多组件库(例如 fusion design&#xff0c;ant design)提供了功能丰富的表格…

t580 thinkpad_聊聊ThinkPad T580:除了大屏,还有什么

我曾在 IBM 就职过一段时间&#xff0c;当时办公室内清一色的都是 ThinkPad 笔记本和 ThinkStation 台式机&#xff0c;给我配备的就是一台 ThinkPad T430&#xff0c;它稳定的表现和扎实的做工一度让我印象深刻&#xff0c;而这也是我与 ThinkPad 的前端次接触。数年之后&…

linux修改arena大小,Resolume Arena怎么设置大屏幕 调整画面屏幕的方法

如果你想要制作VJ视频&#xff0c;那么Resolume Arena绝对可以满足你的所有需求&#xff0c;小编近期了解到很多用户不知道怎么设置大屏幕&#xff0c;如果你还不知道具体的操作方法&#xff0c;就赶快来看看下面的教程吧&#xff01;操作步骤如下&#xff1a;1、如果你在使用R…

linux-休眠命令

参考&#xff1a;http://blog.csdn.net/hshl1214/article/details/6228275 命令行中执行如下&#xff1a;[rootfsc feng]# file /sys/power/state/sys/power/state: ASCII text[rootfsc feng]# cat /sys/power/statestandby mem disk[rootfsc feng]# echo “mem”>/sys/powe…

for each循环_Power Query — 循环初步

题记&#xff1a;《Excel圣经》1:3 微软说&#xff0c;“要有循环”&#xff0c;便有了循环。引子&#xff1a;keyword: one of and as each else error false if in is let meta not otherwise or section shared then true try type #binary #date #datetime #datetimezone #…

linux 直接映射 页表大小,linux 启动过程临时页表到底映射了多大内存?

从linux-2.4内核开始&#xff0c;在建立临时页表的时候&#xff0c;一般的教科书都说是映射了8M的物理内存&#xff0c;但是为什么是映射8M呢&#xff1f;当时网上有资料说&#xff0c;8M足够了&#xff0c;但为什么就足够了&#xff0c;一直没有彻底搞清楚&#xff0c;今天又重…

字符串字段当条件查询的时候需要加引号吗_如此详细的SQL优化教程,是你需要的吗?...

基础数据准备二&#xff1a;五百万数据插入上面插入几条测试数据&#xff0c;在使用索引时还需要插入更多的数据作为测试数据&#xff0c;下面就通过存储过程插入500W条数据作为测试数据三&#xff1a;使用索引和不使用索引的比较没有添加索引前一个简单的查询用了1.79秒创建索…

使用CoreImage教程

使用CoreImage教程 CoreImage包含有很多实用的滤镜,专业处理图片的库,为了能看到各种渲染效果,请使用如下图片素材. 现在可以开始教程了: #define FIX_IMAGE(image) fixImageWidth(image, 320.f)// 固定图片的宽度 UIImage * fixImageWidth(UIImage *image, CGFloat width) {f…

电脑生成siri语音_米家智能台灯1S全新升级,支持小爱和Siri的语音控制

夜晚的灯光是我们最为需要的东西&#xff0c;但很多时候&#xff0c;我们需要灯照在不同的地方&#xff0c;平时我只靠吸顶灯的光来照亮家里的每一个角落&#xff0c;甚至是看书的时候都只靠吸顶灯照明。台灯作为占用面积小&#xff0c;光照均匀&#xff0c;让很多的人越来越依…

linux vnc检查,检查Ubuntu VNC设置(避免远程登陆)

(1)安装x11vncsudo apt-get install x11vnc(2)将x11vnc加入xinetdsudo gedit /etc/xinetd.d/x11vnc加入下面这段service x11vnc{ port 5900 type UNLISTED socket_type stream protocol tcp wait …

JavaScript网络地址作为参数_JavaScript之bind的模拟实现

阅读本文约需要5分钟大家好&#xff0c;我是你们的导师&#xff0c;我每天都会给大家分享一些干货内容(当然了&#xff0c;周末也要允许老师休息一下哈)。昨天给大家分享了JavaScript的call和apply的模拟实现&#xff0c;今天给大家分享一下bind的模拟实现。什么是bind&#xf…

c#输入三个数选出最大的_C#习题,3、 输入三个数字,输出他们的最大值。(if) | 学步园...

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{class Program{static void Main(string[] args){int i1 Int("一");int i2 Int("二");int i3 Int("三");if (i1 > i2…

Node.js进程管理之Process模块

在前面Node.js事件运行机制也有提到,Node.js应用在单个线程运行,但是现在大部分服务器都是多处理器,为了方便使用多个进程,Node.js提供了3个模块。Process模块提供了访问正在运行的进程。child_process模块可以创建子进程&#xff0c;并与他们通信。cluster模块提供了实现共享相…

cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项

1、环境cdh5.12.3spark2 2.3.02、需要本地地洞spark2-shell用于环境测试错误一&#xff1a;Error: A JNI error has occurred, please check your installation and try againException in thread "main" java.lang.NoClassDefFoundError: org/slf4j/Loggerat java.l…

ue4如何恢复初始状态_如何解决三菱伺服电机上常见报警代码

如何解决三菱伺服电机上常见报警代码&#xff0c;伺服电机报警时电机停止方式与报警解除呢&#xff1f;那么报警解除具体方法有哪些&#xff1f;下面小编为你分享如何解决三菱伺服电机上常见报警代码。1、报警时伺服电机的停止方式停止方式中记载为SD的报警及警告在强制停止减速…

python的六个类型_介绍Python中6个序列的内置类型

原标题&#xff1a;介绍Python中6个序列的内置类型 1、Python中6个序列的内置类型分别是什么&#xff1f; Python包含6中内建的序列&#xff0c;即列表、元组、字符串、Unicode字符串、buffer对象和 xrange 对象。序列通用的操作包括&#xff1a;索引、长度、组合&#xff08;序…

经典排序算法之基数排序(C语言版)

排序算法之基数排序的C语言实现。#include "math.h" #include "stdio.h"/* * 基数排序 2016-04-18 23:43:49 * 基数排序的思想&#xff1a;1.求出数组中最大的元素。 * 2.求出最大元素是几位数。设为i位。 * 3.对所有的数进行i轮排序。首先排个位&a…

c语言long的格式字符串,时间字符串和long类型之间的转换

2015-08-29 10:15:01在进行时间存储时&#xff0c;经常会对时间字符串进行转型存储&#xff0c;一般都是存储为long类型&#xff0c;下面我先来说一下如何将时间字符串转换为long类型&#xff1a;如果时间字符串只有年月日&#xff0c;可以这样转储var ddate new Date(2014-0…