create queue
来源:互联网 发布:ubuntu好的软件源 编辑:程序博客网 时间:2024/06/05 22:55
#include <sys/types.h>#include <sys/msg.h>#include <unistd.h>void msg_stat(int,struct msqid_ds );void main(){ int gflags,sflags,rflags; key_t key; int msgid; int reval; struct msgsbuf{ int mtype; char mtext[1]; }msg_sbuf; struct msgmbuf { int mtype; char mtext[10]; }msg_rbuf; struct msqid_ds msg_ginfo,msg_sinfo; char* msgpath="/home/wulei/wulei/ipc.c"; key=ftok(msgpath,'a'); printf("key is %x",key); gflags=IPC_CREAT|IPC_EXCL; msgid=msgget(key,gflags|00666); if(msgid==-1) { printf("msg create error\n"); msgid=msgget(key,0); if (-1==msgid) { printf("111111111\n"); return; } } //创建一个消息队列后,输出消息队列缺省属性 printf("\nOutput 1:"); 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("message send error\n"); } //发送一个消息后,输出消息队列属性 printf("\nOutput 2:%c",msg_sbuf.mtext[0]); msg_stat(msgid,msg_ginfo);#if 0 rflags=IPC_NOWAIT|MSG_NOERROR; reval=msgrcv(msgid,&msg_rbuf,4,10,rflags); if(reval==-1) printf("read msg error\n"); else printf("read from msg queue %d bytes\n",reval); printf("\nrcv type =%d,msg =%c",msg_rbuf.mtype,*(msg_rbuf.mtext)); //从消息队列中读出消息后,输出消息队列属性#endif printf("\nOutput 3:"); msg_stat(msgid,msg_ginfo); msg_sinfo.msg_perm.uid=8;//just a try msg_sinfo.msg_perm.gid=8;// msg_sinfo.msg_qbytes=16388; //此处验证超级用户可以更改消息队列的缺省msg_qbytes //注意这里设置的值大于缺省值 reval=msgctl(msgid,IPC_SET,&msg_sinfo); if(reval==-1) { printf("msg set info error\n"); //return; } printf("\nOutput 4:"); msg_stat(msgid,msg_ginfo); //验证设置消息队列属性#if 0 reval=msgctl(msgid,IPC_RMID,NULL);//删除消息队列 if(reval==-1) { printf("unlink msg queue error\n"); return; }#endif}void msg_stat(int msgid,struct msqid_ds msg_info){ int reval; sleep(1);//只是为了后面输出时间的方便 reval=msgctl(msgid,IPC_STAT,&msg_info); if(reval==-1) { printf("get msg info error\n"); return; } printf("\n"); printf("current number of bytes on queue is %d\n",msg_info.msg_cbytes); printf("number of messages in queue is %d\n",msg_info.msg_qnum); printf("max number of bytes on queue is %d\n",msg_info.msg_qbytes); //每个消息队列的容量(字节数)都有限制MSGMNB,值的大小因系统而异。在创建新的消息队列时,//msg_qbytes的缺省值就是MSGMNB printf("pid of last msgsnd is %d\n",msg_info.msg_lspid); printf("pid of last msgrcv is %d\n",msg_info.msg_lrpid); printf("last msgsnd time is %s", ctime(&(msg_info.msg_stime))); printf("last msgrcv time is %s", ctime(&(msg_info.msg_rtime))); printf("last change time is %s", ctime(&(msg_info.msg_ctime))); printf("msg uid is %d\n",msg_info.msg_perm.uid); printf("msg gid is %d\n",msg_info.msg_perm.gid);}