要求使用消息队列,实现两个进程之间的通信。
写端程序分析:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
//写入数据的及结构体
struct msgbuf{
long mtype; //消息的类型,大于0的数字
char mtext[50]; //消息的正文
};
int main(int argc,char *argv[])
{
//为消息队列申请key值
key_t key = ftok(".",10);
//用key值作为参数申请消息队列的ID号
int msgid = msgget(key,IPC_CREAT|0666);
//不断往消息队列中发送数据
//定义消息队列结构体变量
struct msgbuf gec;
int ret;
while(1)
{
//对消息队列结构体进行初始化操作
bzero(&gec,sizeof(gec));
gec.mtype = 30;
//从键盘获取输入信息
fgets(gec.mtext,sizeof(gec.mtext),stdin);
//将获取的数据写入到消息队列中
//msgsnd的参数分别为 :消息队列的id号,写入数据的结构体的地址,数据结构体中的正文大小,默认的阻塞属性
ret = msgsnd(msgid,&gec,strlen(gec.mtext),0);
if(ret == -1)
{
//数据写入失败
printf("msgsnd error!\n");
//异常退出
exit(-1);
}
if(strncmp(gec.mtext,"quit",4) == 0)
{
break;
}
}
return 0;
}
读端程序分析:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
//定义消息队列写入结构体
struct msgbuf{
long mtype; //消息队列的类型
char mtext[50]; //消息队列的正文
};
int main(int argc,char *argv[])
{
//为消息队列申请key值
key_t key = ftok(".",10);
//用申请的key值申请消息队列的ID号
int msgid = msgget(key,IPC_CREAT|0666);
//不断接收消息队列上的数据
//定义一个消息队列结构体类型变量gec
struct msgbuf gec;
int ret;
while(1)
{
//对消息队列结构体进行初始化操作
bzero(&gec,sizeof(gec));
//读取消息队列结构体中的数据
//msgrcv函数的参数为:消息队列的id号,接收数据的缓冲区,数据结构体正文的大小,想读取的类型,普通属性
ret = msgrcv(msgid,&gec,sizeof(gec.mtext),30,0);
if(ret == -1)
{
printf("msgrcv error!\n");
exit(-1);
}
printf("from queue:%s",gec.mtext);
if(strncmp(gec.mtext,"quit",4) == 0)
{
break;
}
}
//4. 删除消息队列
msgctl(msgid,IPC_RMID,NULL);
return 0;
}