题目:
代码实现:
#include <myhead.h>
//正文大小
#define MSGSZ (sizeof(struct msgbuf)-sizeof(long))
//定义要发送的消息类型
struct msgbuf{
long msgtype; //消息类型
char mtext[1024]; //消息正文
};
int main(int argc, const char *argv[])
{
pid_t pid;
pid=fork();
struct msgbuf buf;
if(pid>0){//父进程进行写操作//创建一个key值,方便定位到相应的消息队列中
key_t key=ftok("./",'A');
if(-1==key){
perror("ftok error");
return -1;
}
printf("key=%#x\n",key);
//创建消息队列,为了写入数据到队列中
int msqid=msgget(key,IPC_CREAT|0664);//IPC_CREAT创建消息队列 IPC_EXCL检测错误 0664队列的权限
if(-1==msqid){
perror("msgget error");
return -1;
}
printf("msqid=%d\n",msqid);
while(1){
printf("请输入存放数据的类型(填入类型为long)------->\n");
scanf("%ld",&buf.msgtype);
getchar();
printf("请输入正文的内容------->\n");
fgets(buf.mtext,MSGSZ,stdin);
buf.mtext[strlen(buf.mtext)-1]=0;//将‘\n’转换成‘0’
msgsnd(msqid,&buf,MSGSZ,0);//0表示阻塞
printf("写入到信息队列成功!(^<>^)!\n");
if(0==strcmp(buf.mtext,"quit")){
break;
}
}
}else if(pid==0){//子进程读取队列节点中数据//创建一个key值,方便定位到相应的消息队列中
key_t key=ftok("./",'A');
if(-1==key){
perror("ftok error");
return -1;
}
printf("key=%#x\n",key);
//创建消息队列,为了写入数据到队列中
int msqid=msgget(key,IPC_CREAT|0664);//IPC_CREAT创建消息队列 IPC_EXCL检测错误 0664队列的权限
if(-1==msqid){
perror("msgget error");
return -1;
}
printf("msqid=%d\n",msqid);
while(1){
//从消息队列中读取消息
//第一个0表示一直取第一个消息
//第二个0表示阻塞方式取出
msgrcv(msqid, &buf, MSGSZ, 0, 0);
printf("收到消息为:%s\n", buf.mtext);
if(strcmp(buf.mtext, "quit") == 0)
{
break;
}
}
}
return 0;
}
注意事项:
进程中包含读写操作,读取节点时用msgrcv(msqid, &buf, MSGSZ, 0, 0);,那么终端一的读操作和终端二的写操作会发生竟态,故目前有两种解决方案:
方案一:创建两个消息队B
方案二:分类获取信息,终端一获取"A"类型节点,终端二获取"B"类节点;
终端一获取"B"类型节点,终端二获取"A"类节点;