linux间进程通信

linux间进程通信

ID:40562355

大小:41.00 KB

页数:7页

时间:2019-08-04

linux间进程通信_第1页
linux间进程通信_第2页
linux间进程通信_第3页
linux间进程通信_第4页
linux间进程通信_第5页
资源描述:

《linux间进程通信》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、linux间进程通信--消息队列2010-08-2411:47消息队列允许一个或者多个进程向它写入与读取消息。Linux维护着一个msgque消息队列链表,其中每个元素指向一个描叙消息队列的msqid_ds结构。当创建新的消息队列时,系统将从系统内存中分配一个msqid_ds结构,同时将其插入到数组中。                                                              系统VIPC消息队列每个msqid_ds结构包含一个ipc_perm结构和指向已经进入此队列消息的指针。另外,Linux保留有关队列修改时

2、间信息,如上次系统向队列中写入的时间等。msqid_ds包含两个等待队列:一个为队列写入进程使用而另一个由队列读取进程使用。每次进程试图向写入队列写入消息时,系统将把其有效用户和组标志符与此队列的ipc_perm结构中的模式进行比较。如果允许写入操作,则把此消息从此进程的地址空间拷贝到msg数据结构中,并放置到此消息队列尾部。由于Linux严格限制可写入消息的个数和长度,队列中可能容纳不下这个消息。此时,此写入进程将被添加到这个消息队列的等待队列中,同时调用调度管理器选择新进程运行。当由消息从此队列中释放时,该进程将被唤醒。从队列中读的过程与之类似。进程对这个

3、写入队列的访问权限将被再次检验。读取进程将选择队列中第一个消息(不管是什么类型)或者第一个某特定类型的消息。如果没有消息可以满足此要求,读取进程将被添加到消息队列的读取等待队列中,然后系统运行调度管理器。当有新消息写入队列时,进程将被唤醒继续执行。LINUX进程通讯方式很多,其中消息队列是一种可以传送少量信息的通讯方式。1、消息队列创建函数首先应包含进相应头文件:  #include#include#includeintmsgget(key_tkey,intmsgflg)创建一个新的消息队列

4、,或者存取一个已经存在的消息队列,系统调用成功返回值为队列ID,失败返回-1;参数说明;key:创建打开队列key值,由ftok函数产生,可以直接给常量;msgflg:创建打开队列方式IPC_CREAT、IPC_EXCL、IPC_NOWAIT通常是msgflg=IPC_CREAT

5、IPC_EXCL

6、0666,即若不存在key值的队列,则创建一个新的队列,否则打开这个队列,0666意思与一般文件权限一样。key_tftok(constchar*pathname,intproj_id);获取pathname相对应的一个键值,pathname必须是存在并且可读取

7、的文件;成功返回key值,失败返回-1.参数:pathname:文件路径proj_id:区别存在文件的序号;2、队列读取函数所包含头文件:#include#include#include读取数据函数(阻塞读取消息队列,直到解除阻塞)ssize_tmsgrcv(intmsqid,structmsgbuf*msgp,size_tmsgsz,longmsgtyp,intmsgflg);参数:msqid:已打开的消息队列ID,由函数msgget()得到;msgp:接受存放的消息队列缓存结构;结构定义

8、如下:structmsgbuf{longmtype:   //消息类型,必须大于零charmtext[1];//消息数据,这里只是一个数组的首地址,并非是只有一个字符    }msgsz:消息数据长度;msgtyp:消息类型。=0读取队列中第一个数据。msgflg:读取标志通常使用IPC_NOWAIT:即没有满足条件的消息,立即返回,此时错误代码errno=ENOMSGIPC_EXCEPT:与msgtyp>0配合使用,返回队列中第一个类型不为msgtyp的消息;MSG_NOERROR:截断超长数据;msgrcv()解除阻塞的三个条件:1、消息队列中有了满足条件

9、的消息;2、msgid代表的消息队列被删除;3、调用msgrcv()的进程被信号中断;发送数据:intmsgsnd(intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg);msqid:已打开的消息队列ID;msgp:发送存放的消息队列缓存结构;msgsz:消息数据长度;msgflg:消息类型。=0读取队列中第一个数据。消息队列控制函数:intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);成功返回0,失败返回-1.msqid:已打开的消息队列ID;cmd:控制类型选项  IPC_

10、STAT;取得队列状态;IPC_SET

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。