`
umgsai
  • 浏览: 103183 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Linux消息队列应用

 
阅读更多

  1. #include"sys/types.h"
  2. #include"sys/msg.h"
  3. #include"unistd.h"
  4. #include"stdio.h"
  5. voidmsg_stat(int,structmsqid_ds);
  6. intmain()
  7. {
  8. intgflags,sflags,rflags;
  9. key_tkey;
  10. intmsgid;
  11. intreval;
  12. structmsgbuf{
  13. intmtype;
  14. charmtext[1];
  15. }msg_sbuf;
  16. structmsgmbuf{
  17. intmtype;charmtext[10];
  18. }msg_rbuf;
  19. structmsqid_dsmsg_ginfo,msg_sinfo;
  20. char*msgpath="/UNIX/msgqueue";
  21. key=ftok(msgpath,'a');
  22. gflags=IPC_CREAT|IPC_EXCL;
  23. msgid=msgget(key,gflags|00666);
  24. if(msgid==-1){
  25. printf("msgcreateerror!\n");
  26. return;
  27. }
  28. /*创建一个消息队列后,输出消息队列默认属性*/
  29. msg_stat(msgid,msg_ginfo);
  30. sflags=IPC_NOWAIT;
  31. msg_sbuf.mtype=10;
  32. msg_sbuf.mtext[0]='a';
  33. reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
  34. if(reval==-1)
  35. {
  36. printf("messagesenderror!\n");
  37. }
  38. /*发送一个消息后,输出消息队列属性*/
  39. msg_stat(msgid,msg_ginfo);
  40. rflags=IPC_NOWAIT|MSG_NOERROR;
  41. reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);
  42. if(reval==-1)
  43. {
  44. printf("Readmsgerror!\n");
  45. }
  46. else
  47. printf("Readfrommsgqueue%dbytes\n",reval);
  48. /*从消息队列中读出消息后,输出消息队列属性*/
  49. msg_stat(msgid,msg_ginfo);
  50. msg_sinfo.msg_perm.uid=8;
  51. msg_sinfo.msg_perm.gid=8;
  52. msg_sinfo.msg_qbytes=16388;
  53. /************************************************************************/
  54. /*此处验证超级用户可以更改消息队列的默认msg_qbytes*/
  55. //注意这里设置的值大于最大默认值
  56. /************************************************************************/
  57. reval=msgctl(msgid,IPC_SET,&msg_sinfo);
  58. if(reval==-1){
  59. printf("msgsetinfoerror!\n");
  60. return;
  61. }
  62. msg_stat(msgid,msg_ginfo);
  63. /************************************************************************/
  64. /*验证设置消息队列属性*/
  65. /************************************************************************/
  66. reval=msgctl(msgid,IPC_RMID,NULL);//删除消息队列
  67. if(reval==-1)
  68. {
  69. printf("unlinkmsgqueueerror!\n");
  70. return;
  71. }
  72. }
  73. voidmsg_stat(intmsgid,structmsqid_dsmsg_info)
  74. {
  75. intreval;
  76. sleep(1);
  77. reval=msgctl(msgid,IPC_STAT,&msg_info);
  78. if(reval==-1)
  79. {
  80. printf("getmsginfoerror!\n");
  81. return;
  82. }
  83. printf("\n");
  84. printf("currentnumberofbytesonqueueis%ld\n",msg_info.msg_cbytes);
  85. printf("numberofmessagesinthequeueis%ld\n",msg_info.msg_qnum);
  86. printf("maxnumberofbytesonqueueid%ld\n",msg_info.msg_qbytes);
  87. /************************************************************************/
  88. /*每个消息队列是容量(字节数)都有限制MSGMNB,值的大小因系统而异
  89. 在创建新的消息队列时,msg_qtytes的默认值就是MSHMNB
  90. /************************************************************************/
  91. printf("pidoflastmsgsndis%ld\n",msg_info.msg_lspid);
  92. printf("pidoflastmsgrcvis%ld\n",msg_info.msg_lrpid);
  93. printf("lastmsgcndtimeis%s\n",ctime(&(msg_info.msg_stime)));
  94. printf("lastmsgrcvtimeis%s\n",ctime(&(msg_info.msg_rtime)));
  95. printf("lastchangetimeis%s\n",ctime(&(msg_info.msg_ctime)));
  96. printf("msguidis%ld\n",msg_info.msg_perm.uid);
  97. printf("msggidis%ld\n",msg_info.msg_perm.gid);
  98. }

本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/702496

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics