已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux间进程通信-消息队列2010-08-24 11:47消息队列允许一个或者多个进程向它写入与读取消息。Linux维护着一个msgque消息队列链表,其中每个元素 指向一个描叙消息队列的msqid_ds结构。当创建新的消息队列时,系统将从系统内存中分配一个msqid_ds结构,同时将其插入到数组中。 系统V IPC消息队列 每个msqid_ds结构包含一个ipc_perm结构和指向已经进入此队列消息的指针。另外,Linux保留有关队列修改时间信息,如上次系统向队列中写入的时间等。msqid_ds包含两个等待队列:一个为队列写入进程使用而另一个由队列读取进程使用。每次进程试图向写入队列写入消息时,系统将把其有效用户和组标志符与此队列的ipc_perm结构中的模式进行比较。如果允许写入操作,则把此消息从此进程的地址空间拷贝到msg数据结构中,并放置到此消息队列尾部。由于 Linux严格限制可写入消息的个数和长度,队列中可能容纳不下这个消息。此时,此写入进程将被添加到这个消息队列的等待队列中,同时调用调度管理器选择新进程运行。当由消息从此队列中释放时,该进程将被唤醒。从队列中读的过程与之类似。进程对这个写入队列的访问权限将被再次检验。读取进程将选择队列中第一个消息(不管是什么类型)或者第一个某特定类型的消息。如果没有消息可以满足此要求,读取进程将被添加 到消息队列的读取等待队列中,然后系统运行调度管理器。当有新消息写入队列时,进程将被唤醒继续执行。 LINUX进程通讯方式很多,其中消息队列是一种可以传送少量信息的通讯方式。1、消息队列创建函数首先应包含进相应头文件: #include #include #include int msgget(key_t key , int msgflg)创建一个新的消息队列,或者存取一个已经存在的消息队列,系统调用成功 返回值为队列ID ,失败返回 -1;参数说明;key :创建打开队列key值,由ftok函数产生,可以直接给常量;msgflg:创建打开队列方式 IPC_CREAT 、IPC_EXCL、IPC_NOWAIT通常是msgflg = IPC_CREAT|IPC_EXCL|0666, 即 若不存在key值的队列,则创建一个新的队列,否则 打开这个队列,0666意思与一般文件权限一样。key_t ftok(const char *pathname , int proj_id);获取pathname相对应的一个键值,pathname必须是存在并且可读取的文件;成功返回key值,失败返回-1.参数:pathname:文件路径proj_id:区别存在文件的序号;2、队列读取函数所包含头文件:#include #include #include 读取数据函数(阻塞读取消息队列,直到解除阻塞)ssize_t msgrcv(int msqid,struct msgbuf *msgp,size_t msgsz, long msgtyp, int msgflg);参数:msqid : 已打开的消息队列ID,由函数msgget()得到;msgp:接受存放的消息队列缓存结构;结构定义如下:struct msgbuf long mtype: /消息类型,必须大于零char mtext1; /消息数据,这里只是一个数组的首地址,并非是只有一个字符 msgsz:消息数据长度;msgtyp:消息类型。=0读取队列中第一个数据。msgflg:读取标志通常使用IPC_NOWAIT:即没有满足条件的消息,立即返回,此时错误代码 errno=ENOMSGIPC_EXCEPT:与msgtyp0 配合使用,返回队列中第一个类型不为msgtyp的消息;MSG_NOERROR:截断超长数据;msgrcv()解除阻塞的三个条件:1、消息队列中有了满足条件的消息;2、msgid代表的消息队列被删除;3、调用msgrcv()的进程被信号中断;发送数据:int msgsnd(int msqid , struct msgbuf * msgp, size_t msgsz, int msgflg);msqid:已打开的消息队列ID;msgp:发送存放的消息队列缓存结构;msgsz:消息数据长度;msgflg:消息类型。=0读取队列中第一个数据。消息队列控制函数:int msgctl(int msqid, int cmd, struct msqid_ds *buf);成功返回0,失败返回-1.msqid:已打开的消息队列ID;cmd:控制类型选项 IPC_STAT;取得队列状态;IPC_SET:设置队列属性;IPC_RMID:删除消息队列;buf:存放队列的属性结构,队列属性定义如下:struct msqid_ds struct ipc_perm msg_perm; /* structure describing operation permission */ _time_t msg_stime; /*最后一次发送消息的时间 */ unsigned long int _unused1; /*保留*/ _time_t msg_rtime; /* 最后一次接收数据时间 */ unsigned long int _unused2; /*保留*/ _time_t msg_ctime; /* 最后修改时间 */ unsigned long int _unused3; /*保留*/ unsigned long int _msg_cbytes; /* 当前队列字节数 */ msgqnum_t msg_qnum; /* 当前队列的消息数 */ msglen_t msg_qbytes; /* 队列中容量 */ _pid_t msg_lspid; /* 最后发送消息的进程号 */ _pid_t msg_lrpid; /* 最后接收队列的进程号*/ unsigned long int _unused4; /*保留*/ unsigned long int _unused5; /*保留*/;实例编程:#include#include#include#define msgkey 0x11000001struct msg_bufint mtype;char data255;int main()key_t key;int msgid;int ret;struct msg_buf msgbuf;key=ftok(/tmp/1,a);msgid=msgget(key,IPC_CREAT|IPC_EXCL|0666);if(-1=msgid)printf(creat errorn);ret -1;msgbuf.mtype=getpid();srtcpy(msgbuf.data,test haha );ret = msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);if(-1=ret)printf(send message errn);return -1;memset(&msgbuf,0,sizeof(msgbuf);ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf,date),getpid(),IPC_NO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓库招聘面试模拟
- 如何面试选拔合格的地震观测员初级人才
- 自动运维护工作流程规范化与工作效率提升计划
- 初级康养师乡村运营案例分析
- 自由职业者全年收入目标规划与业务拓展策略
- 媒体编辑内容生产计划与平台运营策略
- 香席侍香师初级如何晋升为中级侍香师
- 粮油市场预测与决策支持系统研究
- 县体育馆社会体育指导员的工作职责与要求
- 广东南丰镇停水通知书
- 2025年及未来5年中国包头市房地产行业市场供需格局及行业前景展望报告
- 2025年腾讯校招综合素质测评试题及答案
- 2025贵州盐业(集团)黔西南有限责任公司招聘15人笔试考试备考试题及答案解析
- 初中物理欧姆定律(教学课件)2025-2026学年初中物理人教版(2024)九年级全一册
- 2025河南郑州热力集团有限公司招聘60人笔试考试备考试题及答案解析
- 2025广西钦州市公安局面向社会公开招聘警务辅助人员74人笔试考试参考试题及答案解析
- 太仓市国土空间总体规划(2021-2035)
- 2023年最新的罗密欧与朱丽叶剧本中文
- 2022上海市公务员考试信息管理真题单选60多选12刘旻
- 辩论赛详细方案(共14页)
- Q∕GDW 12152-2021 输变电工程建设施工安全风险管理规程
评论
0/150
提交评论