work1.c
#include <myhead.h>
//要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid == -1)
{
perror("fork error");
return -1;
}
if(pid > 0) //父进程
{
//1、创建key值,用于生产消息队列
key_t key = ftok("/", 'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
//2、通过key值创建一个消息队列
int msqid = msgget(key, IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
//向消息队列中存放信息
struct msgbuf buf;
while(1)
{
printf("请输入消息类型:");
scanf("%ld",&buf.mtype);
getchar();
printf("请输入消息正文:");
fgets(buf.mtext,SIZE,stdin);
buf.mtext[strlen(buf.mtext)-1] = 0;
//将消息发送到消息队列中
msgsnd(msqid,&buf,SIZE,0);
printf("发送成功\n");
if(strcmp(buf.mtext,"quit") == 0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) ==-1)
{
perror("msgctl error");
return -1;
}
}
else if(pid == 0) //子进程
{
//1、创建key值,用于生产消息队列
key_t key = ftok("/", 'l');
if(key == -1)
{
perror("ftok error");
return -1;
}
//2、通过key值创建一个消息队列
int msqid = msgget(key, IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
//从消息队列接收消息
struct msgbuf buf1;
while(1)
{
msgrcv(msqid, &buf1, SIZE, 0, 0);
//参数1:消息队列id号
//参数2:数据容器起始地址
//参数3:数据的正文大小
//参数4:消息类型,0表示任意类型
//参数5:表示阻塞读取消息
printf("收到消息为:%s\n", buf1.mtext);
if(strcmp(buf1.mtext, "quit") == 0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) ==-1)
{
perror("msgctl error");
return -1;
}
}
return 0;
}
work2.c
#include <myhead.h>
//要发送的消息类型
struct msgbuf
{
long mtype;
char mtext[1024];
};
#define SIZE sizeof(struct msgbuf)-sizeof(long)
int main(int argc, const char *argv[])
{
pid_t pid = fork();
if(pid == -1)
{
perror("fork error");
return -1;
}
if(pid > 0)
{
//1、创建key值,用于生产消息队列
key_t key = ftok("/", 'k');
if(key == -1)
{
perror("ftok error");
return -1;
}
//2、通过key值创建一个消息队列
int msqid = msgget(key, IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
//从消息队列接收消息
struct msgbuf buf1;
while(1)
{
msgrcv(msqid, &buf1, SIZE, 0, 0);
//参数1:消息队列id号
//参数2:数据容器起始地址
//参数3:数据的正文大小
//参数4:消息类型,0表示任意类型
//参数5:表示阻塞读取消息
printf("收到消息为:%s\n", buf1.mtext);
if(strcmp(buf1.mtext, "quit") == 0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) ==-1)
{
perror("msgctl error");
return -1;
}
}
else if(pid == 0)
{
//1、创建key值,用于生产消息队列
key_t key = ftok("/", 'l');
if(key == -1)
{
perror("ftok error");
return -1;
}
//2、通过key值创建一个消息队列
int msqid = msgget(key, IPC_CREAT|0664);
if(msqid == -1)
{
perror("msgget error");
return -1;
}
//向消息队列存放消息
struct msgbuf buf;
while(1)
{
printf("请输入消息类型:");
scanf("%ld", &buf.mtype);
getchar(); //吸收回车
printf("请输入消息正文:");
fgets(buf.mtext, SIZE, stdin); //从终端获取数据
buf.mtext[strlen(buf.mtext)-1] = 0; //将换行换成 '\0'
//将消息发送到消息队列中
msgsnd(msqid, &buf, SIZE, 0);
//参数1:消息队列id号
//参数2:消息的起始地址
//参数3:消息正文大小
//参数4:阻塞形式发送数据
printf("发送成功\n");
if(strcmp(buf.mtext, "quit") == 0)
{
break;
}
}
//删除消息队列
if(msgctl(msqid, IPC_RMID, NULL) ==-1)
{
perror("msgctl error");
return -1;
}
}
return 0;
}