- #include
- //要发送数据的结构体类型
- struct msgbuf {
- long mtype; /* 消息类型*/
- char mtext[1024]; /* 正文数据 */
- };
- //宏定义正文大小
- #define SIZE sizeof(struct msgbuf)-sizeof(long)
- int main(int argc, const char *argv[])
- {
-
- key_t key;
- if((key=ftok("./",'k'))==-1)
- {
- ERR_MSG("ftok");
- return -1;
- }
- //2.通过key值创建消息队列
- int msgid;//消息队列号
- if((msgid=msgget(key,IPC_CREAT|0664)) ==-1 )
- {
- ERR_MSG("msgid");
- return -1;
- }
- pid_t pid =fork();
- if(pid<0)
- {
- ERR_MSG("fork");
- }else if(pid==0)//子进程控制消息队列发送
- {
-
- //3.向消息队列中发送数据
- struct msgbuf info;
- info.mtype=100;//设置信道为100 第二个文件只能读取信道为100的消息
- while(1)
- {
- //清空数组中内容
- bzero(info.mtext,sizeof(info.mtext));
- fgets(info.mtext,SIZE,stdin);//从终端读取数据
- info.mtext[strlen(info.mtext)-1]=0;//将'\n'转化为'\0'
- //调用发送函数
- msgsnd(msgid,&info,SIZE,IPC_NOWAIT);
- //参数1:向哪个消息队列中发数据
- //参数2:要发送消息的地址
- //参数3:要发送消息的正文大小
- //参数4:阻塞形式发送
- if(strcmp(info.mtext,"quit")==0)
- {
- break;
-
- }
- }
-
- }else//父进程控制,接收
- {
-
- struct msgbuf info;
-
- while(1)
- {
- //清空数组中内容
- bzero(info.mtext,sizeof(info.mtext));
- //调用接收函数
- msgrcv(msgid,&info,SIZE,50,0);
- //参数1:向哪个消息队列中发数据
- //参数2:要发送消息的地址
- //参数3:50,表示读取信道为50的
- //参数4:表示阻塞接收
- printf("消息为:%s\n",info.mtext);
- }
-
- }
- return 0;
- }
-
- #include
- //要发送数据的结构体类型
- struct msgbuf {
- long mtype; /* 消息类型*/
- char mtext[1024]; /* 正文数据 */
- };
- //宏定义正文大小
- #define SIZE sizeof(struct msgbuf)-sizeof(long)
- int main(int argc, const char *argv[])
- {
-
- key_t key;
- if((key=ftok("./",'k'))==-1)
- {
- ERR_MSG("ftok");
- return -1;
- }
- //2.通过key值创建消息队列
- int msgid;//消息队列号
- if((msgid=msgget(key,IPC_CREAT|0664)) ==-1 )
- {
- ERR_MSG("msgid");
- return -1;
- }
- pid_t pid =fork();
- if(pid<0)
- {
- ERR_MSG("fork");
- }else if(pid==0)//子进程控制消息队列发送
- {
-
- //3.向消息队列中发送数据
- struct msgbuf info;
- info.mtype=50;//设置信道为100 第二个文件只能读取信道为100的消息
- while(1)
- {
- //清空数组中内容
- bzero(info.mtext,sizeof(info.mtext));
- fgets(info.mtext,SIZE,stdin);//从终端读取数据
- info.mtext[strlen(info.mtext)-1]=0;//将'\n'转化为'\0'
- //调用发送函数
- msgsnd(msgid,&info,SIZE,IPC_NOWAIT);
- //参数1:向哪个消息队列中发数据
- //参数2:要发送消息的地址
- //参数3:要发送消息的正文大小
- //参数4:阻塞形式发送
- if(strcmp(info.mtext,"quit")==0)
- {
- break;
-
- }
- }
-
- }else//父进程控制,接收
- {
-
- struct msgbuf info;
-
- while(1)
- {
- //清空数组中内容
- bzero(info.mtext,sizeof(info.mtext));
- //调用接收函数
- msgrcv(msgid,&info,SIZE,100,0);
- //参数1:向哪个消息队列中发数据
- //参数2:要发送消息的地址
- //参数3:50,表示读取信道为50的
- //参数4:表示阻塞接收
- printf("消息为:%s\n",info.mtext);
- }
-
- }
- return 0;
- }
-