首先创建一个新的消息队列后,第一次调用msg_stat子函数打印出该消息队列的相关信息;然后向消息队列中发送一个消息后,第二次调用msg_stat打印消息队列此时相关信息;接着调用msgrcv从消息队列中读走消息后,第三次调用msg_stat打印消息队列此时的相关信息;最后试图使用root权限更改消息队列此时的相关属性,并再次调用msg_stat打印更改后的消息队列的信息。程序的最后,调用msgctl关闭该消息队列。
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <unistd.h> void msg_stat(int,struct msqid_ds); int main(void) { 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="/unix/msgquene"; key=ftok(msgpath,\'a\');/*获取消息队列键值*/ gflags=IPC_CREAT|IPC_EXCL; msgid=msgget(key,gflags|00666);/*调用msgget创建消息队列*/ if(msgid = -1) { printf("msg create error\n"); return; } msg_stat(msgid,msg_ginfo);/*创建一个消息队列后,输出队列缺省属性。第一次调用msg_stat子函数*/第一次打印 sflags = IPC_NOWAIT;/*消息队列满时,msgsnd不等待,立刻出错返回*/ msg_sbuf.mtype = 10; msg_sbuf.mtext[0]=\'a\';/*将要发送的消息数据*/ reval = msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);/*调用msgs发送消息*/ if(reval == -1) { printf("message send error\n"); } msg_stat(msgid,msg_ginfo);/*成功发送一个消息后,输出此时消息队列属性。第二次调用msg_stat子函数*/ rflags = IPC_NOWAIT|MSG_NOERROR; reval = msgrcv(msgid,&msg_rbuf,4,10,rflags);/*调用msgrcv接收消息,接收数据长度为4,type > 0*/ if(reval == -1) { printf("read msg error\n"); } 运行结果:进程间通信(2)——消息队列 (2)
内容版权声明:除非注明,否则皆为本站原创文章。