#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)  //删除消息队列

linux 声明消息函数,linux消息队列函数--解析相关推荐

  1. Linux进程间通信详解(三) —— 消息队列及函数

    消息队列的概念 消息队列就是一个消息的链表,每个消息队列都有一个队列头,用结构struct msg_queue来描述.队列头中包含了该队列的大量信息,包括消息队列的键值.用户ID.组ID.消息数目.读 ...

  2. Linux进程间通讯之消息队列

    首先有个大体的概念:http://www.xefan.com/archives/83703.html 头文件: #include <sys/ipc.h> #include <sys/ ...

  3. Linux IPC实践(7) --Posix消息队列

    1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...

  4. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

  5. 【Linux 内核】实时调度类 ⑦ ( 实时调度类核心函数源码分析 | dequeue_task_rt 函数 | 从执行队列中移除进程 )

    文章目录 一.dequeue_task_rt 函数 ( 从执行队列中移除进程 ) 二.update_curr_rt 函数 ( 更新调度信息 ) 本篇博客中 , 开始分析 struct sched_cl ...

  6. Linux进程间通信二 System V 消息队列简介与示例

    1. SystemV消息队列简介 消息队列,顾名思义即是存放消息的队列,内核为每个SystemV 维护了一个msg_queue的结构体,里面记录了每个消息队列的信息. struct msg_queue ...

  7. 【Linux系统编程】进程间通信--消息队列

    概述 消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下: 1)消息队列可以实现消息的随机查询.消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取. 2)消息队列允 ...

  8. ibm linux mq 发送消息_IBM MQ简明教程——2. 将消息发送至远程队列

    一. 创建队列管理器 通过以下命令,创建名为QMGR_02_BANK的队列管理器 crtmqm QMGR_02_BANK 通过输入以下命令来启动此队列管理器 strmqm QMGR_02_BANK 示 ...

  9. POSIX标准总体分析 执行调度 消息传递 调度参数 进程调度函数 关闭消息队列 得到消息队列参数 设置调度参数 时钟和定时器  时钟和定时器函数 消息传递函数 打开消息队列 设置消息队列参数

    粉丝不过w 调度参数 一个调度参数结构 sched_param 包括了调度策略所支持的执行者所需要的调度参数,它在头文件<sched.h>中定义 执行者可根据规对该结构进行扩展 调度策略 ...

  10. linux查看队列 msg,linux第10天 msg消息队列

    cat /proc/sys/kernel/msgmax最大消息长度限制 cat /proc/sys/kernel/msgmnb消息队列总的字节数 cat /proc/sys/kernel/msgmni ...

最新文章

  1. 【博士论文】视觉语言交互中的视觉推理研究
  2. 认识OSSIM中的UUID
  3. linux centos 没有service命令 安装方法
  4. ecshop调用指定ID分类下的文章列表(指定分类下的文章)
  5. 反病毒引擎设计全解(三)
  6. 醒醒!Python已经支持中文变量名啦!
  7. touchesEnded不响应
  8. 自己常用的wireshark过滤条件
  9. 财务模块多组织,GL, SLA, SOB, COA, BSV, CCID, LE 概念的简单介绍
  10. springbatch读取文件_通过例子讲解Spring Batch入门,优秀的批处理框架
  11. I - Destroy Walls (HDU - 6187)
  12. C++程序设计(三:可视化)
  13. InDesign 软件教程,如何在 InDesign 中缩放和平移文档?
  14. MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)
  15. h5页面判断安卓或ios点击下载App
  16. [剑指Offer]:翻转单词顺序
  17. License授权方案
  18. 周志华 《机器学习初步》 绪论
  19. 力扣88 - 合并两个有序数组【归并排序思维】
  20. C++ Awkward Digits

热门文章

  1. h5优秀控件_H5前端学习的js插件大全,基本包含了大部分的前端最前沿的js插件和库。...
  2. 双表查询java代码_多表增删改查
  3. linux命令之有关关机和查看系统信息的命令
  4. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享
  5. layui前端时间戳转化
  6. 11.python并发入门(part5 event对象)
  7. [Android] Android统计Apk , jar包方法数
  8. centos6中三台物理机配置nginx+keepalived+lvs
  9. Crazy Drops 3
  10. python字典键值对转化为相应的变量名和变量值