- #include"sys/types.h"
- #include"sys/msg.h"
- #include"unistd.h"
- #include"stdio.h"
- voidmsg_stat(int,structmsqid_ds);
- intmain()
- {
- intgflags,sflags,rflags;
- key_tkey;
- intmsgid;
- intreval;
- structmsgbuf{
- intmtype;
- charmtext[1];
- }msg_sbuf;
- structmsgmbuf{
- intmtype;charmtext[10];
- }msg_rbuf;
- structmsqid_dsmsg_ginfo,msg_sinfo;
- char*msgpath="/UNIX/msgqueue";
- key=ftok(msgpath,'a');
- gflags=IPC_CREAT|IPC_EXCL;
- msgid=msgget(key,gflags|00666);
- if(msgid==-1){
- printf("msgcreateerror!\n");
- return;
- }
- /*创建一个消息队列后,输出消息队列默认属性*/
- msg_stat(msgid,msg_ginfo);
- sflags=IPC_NOWAIT;
- msg_sbuf.mtype=10;
- msg_sbuf.mtext[0]='a';
- reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
- if(reval==-1)
- {
- printf("messagesenderror!\n");
- }
- /*发送一个消息后,输出消息队列属性*/
- msg_stat(msgid,msg_ginfo);
- rflags=IPC_NOWAIT|MSG_NOERROR;
- reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);
- if(reval==-1)
- {
- printf("Readmsgerror!\n");
- }
- else
- printf("Readfrommsgqueue%dbytes\n",reval);
- /*从消息队列中读出消息后,输出消息队列属性*/
- msg_stat(msgid,msg_ginfo);
- msg_sinfo.msg_perm.uid=8;
- msg_sinfo.msg_perm.gid=8;
- msg_sinfo.msg_qbytes=16388;
- /************************************************************************/
- /*此处验证超级用户可以更改消息队列的默认msg_qbytes*/
- //注意这里设置的值大于最大默认值
- /************************************************************************/
- reval=msgctl(msgid,IPC_SET,&msg_sinfo);
- if(reval==-1){
- printf("msgsetinfoerror!\n");
- return;
- }
- msg_stat(msgid,msg_ginfo);
- /************************************************************************/
- /*验证设置消息队列属性*/
- /************************************************************************/
- reval=msgctl(msgid,IPC_RMID,NULL);//删除消息队列
- if(reval==-1)
- {
- printf("unlinkmsgqueueerror!\n");
- return;
- }
- }
- voidmsg_stat(intmsgid,structmsqid_dsmsg_info)
- {
- intreval;
- sleep(1);
- reval=msgctl(msgid,IPC_STAT,&msg_info);
- if(reval==-1)
- {
- printf("getmsginfoerror!\n");
- return;
- }
- printf("\n");
- printf("currentnumberofbytesonqueueis%ld\n",msg_info.msg_cbytes);
- printf("numberofmessagesinthequeueis%ld\n",msg_info.msg_qnum);
- printf("maxnumberofbytesonqueueid%ld\n",msg_info.msg_qbytes);
- /************************************************************************/
- /*每个消息队列是容量(字节数)都有限制MSGMNB,值的大小因系统而异
- 在创建新的消息队列时,msg_qtytes的默认值就是MSHMNB
- /************************************************************************/
- printf("pidoflastmsgsndis%ld\n",msg_info.msg_lspid);
- printf("pidoflastmsgrcvis%ld\n",msg_info.msg_lrpid);
- printf("lastmsgcndtimeis%s\n",ctime(&(msg_info.msg_stime)));
- printf("lastmsgrcvtimeis%s\n",ctime(&(msg_info.msg_rtime)));
- printf("lastchangetimeis%s\n",ctime(&(msg_info.msg_ctime)));
- printf("msguidis%ld\n",msg_info.msg_perm.uid);
- printf("msggidis%ld\n",msg_info.msg_perm.gid);
- }
本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/702496