Linux实验 消息队列.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux实验 消息队列

消息队列 消息队列存在于系统内核中每个消息队列的容量(所能容纳的字节数)都有限制,该值因系统不同而不同一般来说,实际开发过程中不会超过这个限制。有关函数msgget()、msgsnd()、msgrcv()、msgctl()。 1、msgget() 函数原型: #includesys/msg.h int msgget(key_t key,int msgflg); 功能:创建一个消息队列或取得一个已经存在的消息队列 返回值:成功返回消息队列的标示符(ID),失败为-1 参数: key消息队列的键值,为IPC_PRIVATE创建一个只能被创建进程读写的消息队列不是IPC_PRIVATE则可指定个值,还可以用ftok函数来获得一个唯一的键值 ftok()函数其它文章msgflg:创建消息队列的创建方式或权限创建方式有:IPC_CREAT,如果内存则创建一个消息队列,否则取得 IPC_EXCL,消息队列存在时,新的消息队列才会被创建,否则会产生错误。 例:msgget()创建一个消息队列。 #includestdio.h #includestdlib.h #includesys/msg.h #define MYMSG_KEY 75 int main() { int msgid; msgid=msg(MYMSG_KEY,IPC_CREAT | 0644); printf(msgid=%d\n,msgid); if(msgid==-1){ perror(msgget error :); exit(EXIT_FAILURE); } return 0; } 运行结果如下: 可用ipcs -q 来查看是否创建成功用ipcrm –q msgidmsgsnd() 函数原型: #includesys/msg.h int msgsnd(int msgid,struct msgbuf *msgp ,int msgsz, int msgflg); 功能:往队列中发送一个消息。 返回值:成功返回0,失败返回-1; 参数: sgid:消息识id也就是msgget()函数的返回值msgp:指向消息缓冲区的指针,该结构体为 struct mymesg { long mtype; /*消息类型*/ char mtext[512]; /*消息*/ } msgsz:消息的大小,不包含消息类型(4个字节) msgflg可以设置为0或者IPC_NOWAIT如IPC_NOWAIT,则当消息队列已满,消息不写消息队列,控制将返回到进程如果没有指明,调用进程会被挂起,直到消息写到消息队列。 例:msgsnd()向指定消息队列发送消息。 #includestdio.h #includestdlib.h #includesys/msg.h #includestring.h #define MYMSG_KEY 75 struct mymesg { long mtype; /* 消息类型*/ char mtext[512]; /* 消息文本*/ }; int main() { int msgid,msgsend_ret; char buf[25]; struct mymesg msg_send; msgid=msg(MYMSG_KEY,IPC_CREAT | 0644); printf(msgid=%d\n,msgid); if(msgid==-1){ perror(msgget error :); exit(EXIT_FAILURE); } // write messages to msg queue msg_send.mtype=1; printf(enter a message:\n); scanf(“%s”,buf); // 注意:输入字符串不能包含空格 strcpy(msg_send.mtext,buf); msgsend_ret=msgsnd(msgid,msg_send,strlen(msg_send.mtext)+1,0); if(msgsend_ret==-1){ perror(msgget error: ); exit(EXIT_FAILURE); } return 0; } 运行结果:写入2个消息 通过命令“ipcs –q”,我们可以看到消息的数量为2既然向消息队列中写入了那么就可以读取消息队列中的消息了。msgrcv() 函数原型: #includesys/msg.h int msgrcv(int msgid , struct msgbuf *msgp,int msgsz , long mtype,int msgflg ); 功能:从消息队列中读走消息是读走不是读取,读完之后没有了,这种机制类似于管道 返回值:成功返回0,失败返回-1; 参数: msgid

文档评论(0)

zhuliyan1314 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档