题目:
代码实现:
#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"类节点;