实现功能:
编写程序sender,它创建一个消息队列;然后,循环等待用户通过终端输入一串字符,将这串字符通过消息队列发送给receiver,直到用户输入“bye”为止;最后,它向receiver进程发送消息“end”,并且等待receiver的应答,等到应答消息后,将接收到的应答信息显示在终端屏幕上,删除消息队列,结束程序的运行。编写receiver程序,它通过消息队列接收来自sender的消息,将消息显示在终端屏幕上,直至收到内容为“end”的消息为止,此时,它向sender发送一个应答消息“over”,结束程序的运行。
sender的代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#define MSG_FILE "sender.c"
#define BUFFER 255
#define PERM S_IRUSR|S_IWUSR
struct msgbuf
{
long mtype;
char mtext[BUFFER+1];
};
char message[BUFFER];
int main()
{
struct msgbuf msg;
key_t key;
int msgid;
int i;
//产生IPC对象的键值
if((key=ftok(MSG_FILE,67))==-1)
{
fprintf(stderr,"Creat Key Error:%s \n",strerror(errno));
exit(EXIT_FAILURE);
}
//创建消息队列
if((msgid=msgget(key,PERM|IPC_CREAT))==-1)
{
fprintf(stderr,"Creat MessageQueue Error:%s \n",strerror(errno));
exit(EXIT_FAILURE);
}
msg.mtype=1;
//循环接受用户输入
while(1)
{
scanf("%s",message);
//如果用户输入bye,则发送end给receiver
if(strcmp(message,"bye")==0) {
strncpy(msg.mtext,"end",BUFFER);
msgsnd(msgid,&msg,sizeof(struct msgbuf),0);
break;
} else {
strncpy(msg.mtext,message,BUFFER);
}
msgsnd(msgid,&msg,sizeof(struct msgbuf),0);
}
// memset(&msg,'\0',sizeof(struct msgbuf));
//接收msg.mtype=2的消息,就是从receiver发来的消息
msgrcv(msgid,&msg,sizeof(struct msgbuf),2,0);
printf("Sender receive: %s\n",msg.mtext);
//删除消息队列
if(msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "Remove MessageQueue Error%s \n",strerror(errno));
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
receiver的代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/msg.h>
#define MSG_FILE "sender.c"
#define BUFFER 255
#define PERM S_IRUSR|S_IWUSR
struct msgbuf
{
long mtype;
char mtext[BUFFER+1];
};
int main()
{
struct msgbuf msg;
key_t key;
int msgid;
int i;
char *myask="over";
//通过proj_id 67将sender和receiver关联起来,两者产生的key值是一样的
if((key=ftok(MSG_FILE,67))==-1)
{
fprintf(stderr,"Creat Key Error:%s \n",strerror(errno));
exit(EXIT_FAILURE);
}
if((msgid=msgget(key,PERM|IPC_CREAT))==-1)
{
fprintf(stderr,"Creat MessageQueue Error:%s \n",strerror(errno));
exit(EXIT_FAILURE);
}
//等待接收来自sender的消息,当接受到end时推出,接下去发送over给sender
while(1)
{
msgrcv(msgid,&msg,sizeof(struct msgbuf),1,0);
printf("Receiver receive: %s\n",msg.mtext);
if(strcmp(msg.mtext,"end")==0)
{
break;
}
}
//发送over给sender
msg.mtype=2;
strncpy(msg.mtext,myask,BUFFER);
msgsnd(msgid,&msg,sizeof(struct msgbuf),0);
exit(EXIT_SUCCESS);
}