1.消息队列号100进程端
#include<myhead.h>
//消息结构体
struct msgbuf
{
long int mtype;//消息类型
char mtext[1024];//消息内容
};
不需要消息类型的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, char const *argv[])
{
//创建键值(具体由三个只是先stat结构的st_dev,st_ino;id的低8位组成)
//第二参数设计的意义是为了生成一个唯一可以进行通信的键值key
key_t key=ftok("/",'k');
if (key==-1)
{
perror("ftok error");
return -1;
}
int msgid;
//根据唯一的键值创建的消息队列
if((msgid=msgget(key,IPC_CREAT|0664))==-1)
{
perror("msgget error");
return -1;
}
struct msgbuf buf;
int pid=fork();
if(pid==-1)
{
perror("fork error");
return -1;
}
else if(pid==0)
{
struct msgbuf buf = {.mtype=100};
while (1)
{
//终端输入
bzero(buf.mtext,sizeof(buf.mtext));
fgets(buf.mtext,sizeof(buf.mtext),stdin);
buf.mtext[strlen(buf.mtext)-1]='\0';
//发送消息内容
if(msgsnd(msgid,&buf,MSGSIZE,0)!=0)
{
perror("msgsnd error");
return -1;
}
//发送消息正文为quit则退出
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else{
while (1)
{
bzero(buf.mtext,sizeof(buf.mtext));
//读取接收的消息正文
if(msgrcv(msgid,&buf,MSGSIZE,200,0)==-1)
{
perror("msgrcv error");
return -1;
}
printf("读取的消息为:%s\n", buf.mtext);
//读取消息正文为quit则退出
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
wait(NULL);
}
return 0;
}
2.消息队列号200进程端
#include<myhead.h>
//消息结构体
struct msgbuf
{
long int mtype;//消息类型
char mtext[1024];//消息内容
};
//不需要消息类型的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, char const *argv[])
{
//创建键值(具体由三个只是先stat结构的st_dev,st_ino;id的低8位组成)
//第二参数设计的意义是为了生成一个访问并进行通信的键值key
key_t key = ftok("/", 'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
int msgid;
//根据唯一的键值打开创建的消息队列
if((msgid=msgget(key, IPC_CREAT|0664)) == -1)
{
perror("msgget error");
return -1;
}
//定义消息队列的信息结构体
struct msgbuf buf;
int pid=fork();
if(pid==-1)
{
perror("fork error");
return -1;
}
else if(pid==0)
{
struct msgbuf buf = {.mtype=200};
while (1)
{
//终端输入
bzero(buf.mtext,sizeof(buf.mtext));
fgets(buf.mtext,sizeof(buf.mtext),stdin);
buf.mtext[strlen(buf.mtext)-1]='\0';
//发送消息内容
if(msgsnd(msgid,&buf,MSGSIZE,0)!=0)
{
perror("msgsnd error");
return -1;
}
//发送消息正文为quit则退出
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
exit(EXIT_SUCCESS);
}
else{
while (1)
{
//读取接收的消息正文
if(msgrcv(msgid,&buf,MSGSIZE,100,0)==-1)
{
perror("msgrcv error");
return -1;
}
printf("读取的消息为:%s\n", buf.mtext);
//读取消息正文为quit则退出
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
wait(NULL);
}
//管理消息队列退出时且不需要修改消息队列的类型则删除消息队列
if(msgctl(msgid, IPC_RMID, NULL) == -1)
{
perror("msgctl error");
return -1;
}
return 0;
}
运行效果: