进程间通信之:消息队列
ey*/ if((key=ftok(.,'a'))==-1) { perror(ftok); exit(1); } /*创建消息队列*/ if((qid=msgget(key,IPC_CREAT|0666))==-1) { perror(msgget); exit(1); } printf(Openqueue%d\n,qid); while(1) { printf(Entersomemessagetothequeue:); if((fgets(msg.msg_text,BUFFER_SIZE,stdin))==NULL) { puts(nomessage); exit(1); } msg.msg_type=getpid(); /*添加消息到消息队列*/ if((msgsnd(qid,msg,strlen(msg.msg_text),0))0) { perror(messageposted); exit(1); } if(strncmp(msg.msg_text,quit,4)==0) { break; } } exit(0); } 以下是消息队列接收端的代码: /*msgrcv.c*/ #includesys/types.h> #includesys/ipc.h> #includesys/msg.h> #includestdio.h> #includestdlib.h> #includeunistd.h> #includestring.h> #defineBUFFER_SIZE512 structmessage { longmsg_type; charmsg_text[BUFFER_SIZE]; }; intmain() { intqid; key_tkey; structmessagemsg; /*根据不同的路径和关键字产生标准的key*/ if((key=ftok(.,'a'))==-1) { perror(ftok); exit(1); } /*创建消息队列*/ if((qid=msgget(key,IPC_CREAT|0666))==-1) { perror(msgget); exit(1); } printf(Openqueue%d\n,qid); do { /*读取消息队列*/ memset(msg.msg_text,0,BUFFER_SIZE); if(msgrcv(qid,(void*)msg,BUFFER_SIZE,0,0)0) { perror(msgrcv); exit(1); } printf(Themessagefromprocess%d:%s,msg.msg_type,msg.msg_text); }while(strncmp(msg.msg_text,quit,4)); /*从系统内核中移走消息队列*/ if((msgctl(qid,IPC_RMID,NULL))0) { perror(msgctl); exit(1); } exit(0); } 以下是程序的运行结果。输入“quit”则两个进程都将结束。 $./msgsnd Openqueue327680 Entersomemessagetothequeue:firstmessage Entersomemessagetothequeue:secondmessage Entersomemessagetothequeue:quit $./msgrcv Openqueue327680 Themessagefromprocess6072:firstmessage Themessagefromprocess6072:secondmessage Themessagefromprocess6072:quit
进程间通信 消息队列 Linux 操作系统 msgget 相关文章:
- 进程间通信之: 共享内存(08-13)
- 进程间通信之:实验内容(08-13)
- 进程间通信之: 信号量(08-13)
- 《嵌入式Linux应用程序开发标准教程》(第2版)(09-30)
- 进程间通信之:本章小结及思考与练习(09-13)
- REDIce-Linux--灵活的实时Linux内核(11-12)