- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Posix消息队列和SystemV消息队列
Posix消息队列和System V消息队列
???? 今天弄了一天System V消息队列,遇到了问题终于解决了。在此总结一下。
??? msgsnd(int msqid,const void * ptr,size_t length,int flag)中long类型的消息类型不能为0,否则发送会失败。
?? msgrcv(int msqid,void *ptr ,size_t length,long type ,int flag)中ptr必须是一个结构体的地址,并且该结构体第一个成员要是long类型。否则会接收失败。
消息队列消息队列可以认为是一个消息链表。有足够写权限的线程就可往队列中放置消息,有足够读权限的线程就可以从队列中取走消息。每个消息是一个记录,他有发送者赋予一个优先级。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。Posix消息队列和System V系统的消息队列区别:1、 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列得读则可以返回任意指定优先级的消息2、 当往一个队列放置一个消息时,Posix消息队列允许产生一个信号或启动一个线程,System V消息队列则不提供类似的机制消息的属性:1、 一个无符号整数优先级(Posix)或是长整类型(SystemV)2、 消息的数据部分长度3、 数据本身(System V系统发送消息时需要定义消息的结构,而Posix系统不需要定义这样的结构)Posxi 消息队列mq_open?? 创建一个新消息队列或是打开一个已经存在的消息队列,返回值成为消息队列描述字。mq_close?? 关闭已打开的消息队列。mq_unlink?? 从系统删除消息队列。每个消息队列有四个属性,有mq_getattr获得这些属性,mq_setattr设置其中某个属性?? mq_send:用于往一个队列中放置一个消息?? mq_receive:用于往一个队列中取走一个消息,该函数总是返回所指定队列中最高优先级的最早的消息,而且该优先级能随该消息的内容及长度一同返回。每个消息有一个优先级,他是一个小于MQ_PRIO_MAX的无符号整数,Posix要求这个上限至少为32 。mq_notify 该函数给指定队列建立或删除异步事件通知int mq_notify(mqd_t mqdes ,const struct sigevent *notification);使用规则:1、 如果notification参数非空,那么当前进程希望在有一个消息到达所指定队列而且该队列先前为空时得到通知。我们说该进程被注册为接收该队列的通知2、 如果notification参数为空指针,而且当前进程目前被注册为接收所指定队列的通知,那么现有注册将被撤销。3、 任意时刻只有一个进程可以被注册为接收某个给定队列的通知。4、 当有一个消息到达某个先前为空的队列,而且已有一个进程被注册为接收该队列的通知时,只有没有任何进程阻赛在该队列的mq_receive调用的前提下,通知才会发生。这就是说,在mq_revcive调用中的阻赛比任何通知的注册都优先。5、 当该通知被发送给他的注册进程时,其注册即被撤销,该进程必须再次调用该函数以重新注册。(当消息队列有消息来到时该函数产生一个信号或时线程,信号或线程是由struct sigevent 参数指定的)System V 的消息队列?? System V消息队列使用消息队列标示符标示。具有足够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息。对于系统中的每个消息队列,内核维护一个信息结构,struct msqid_dsmsgget函数用于创建一个新的消息队列或访问一个已经存在的消息队列msgget(key_t key ,int oflag ),在创健一个新消息队列时,msqid_ds结构将被初始化。msgsnd函数往msgget函数建立的消息队列中放置一个消息,msgsnd(int msqid,const void * ptr,size_t length,int flag);其中ptr是一个结构指针,该结构具有如下的模板struct msgbuf{long mtype ; char mtext[1]}; 该模板可以在sys/msg.h;中找到其中消息类型必须大于0,msgbuf 结构定义中的名字mtext不大确切;消息的数据部分并不局限于文本,任何形式的数据都是允许的,无论是二进制数据还是文本。内核根本不解释消息数据的内容。使用模板的说法描述这个结构,因为ptr所指向的只是一个含有消息类型的长整数,消息本身则紧跟在
文档评论(0)