Elinkcloud 发表于 2022-8-2 14:18:00

unix XSI IPC-消息队列例程

注意事项:
linux(2.4.22)限制:
可发送最长消息字节数为8192 ???队列最大容量字节数 16384 ???队列最大队列容量数 16 ???key_t ftok(char* path,int id)使用说明:
????ftok创建一个键,是内核中的队列在外部的ID号,由于消息队列处于内核中,只有创建者和内核知道队列在内核里面的ID号,这样其它的进程就无法知道内核里面队列ID号,所以要关联一个外部键进行关联 ???id (1-255) ???返回内核消息队列的ID号 ???其它的注意就查看一下unix高级环境编程吧,或者有些问题需要讨论就回我吧!!
server.c

#include"msg.h"#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(intargc,char**argv){intqueid=open_msg("/root",100);while(1){fputs("请输入要发送的类型:1or2\n",stdout);inttype;scanf("%d",&type);switch(type){caseMYTYPE_ONE:{msg_send(queid,"MYTYPE_ONE",MYTYPE_ONE);break;}caseMYTYPE_TWO:{msg_send(queid,"MYTYPE_TWO",MYTYPE_TWO);break;}default:{fputs("输入类型错误,请重新输入\n",stdout);break;}}fputs("输入:q为退出,其它表示继续\n",stdout);if(getchar()=='q'){fputs("退出成功!\n",stdout);break;}else{fputs("继续发送消息\n",stdout);}}//不发送退出需要奖队列移除del_que(queid);return0;}

client.c

#include"msg.h"#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(intargc,char**argv){intqueid=open_msg("/root",100);while(1){fputs("请接收要发送的类型:1or2\n",stdout);inttype;scanf("%d",&type);switch(type){caseMYTYPE_ONE:{msg_rec(queid,MYTYPE_ONE);break;}caseMYTYPE_TWO:{msg_rec(queid,MYTYPE_TWO);break;}default:{fputs("输入类型错误,请重新输入\n",stdout);break;}}fputs("输入:q为退出,其它表示继续\n",stdout);if(getchar()=='q'){fputs("退出成功!\n",stdout);break;}else{fputs("继续发送消息\n",stdout);}}//队列移除del_que(queid);return0;}

msg.c

#include<sys/types.h>#include<sys/ipc.h>#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>#include"msg.h"//如果存在队列则打开,没有则创建intopen_msg(char*path,intid){//获取IPC对象的一个键key_tkey=ftok(path,id);if(-1==key){perror("ftok\n");exit(1);}//创建一个队列intqueid=msgget(key,IPC_CREAT|0666);if(-1==queid){perror("msgget\n");exit(1);}returnqueid;}//发送消息到队列voidmsg_send(key_tkey,char*text,longmsgtype){//初始化内容structMSGtmp;memset(&tmp,sizeof(structMSG),0);tmp.mytype=msgtype;strcpy(tmp.mytext,text);//发送消息if(msgsnd(key,&tmp,TEXTSIZE,0)){perror("msgsnd\n");exit(1);}}//从消息队列获取消息并显示voidmsg_rec(key_tkey,longmsgtype){structMSGtmp;if(-1==msgrcv(key,&tmp,TEXTSIZE,msgtype,MSG_NOERROR)){perror("msgrcv\n");exit(1);}printf("receivecontent:%s\n",tmp.mytext);}//删除队列,即使队列里面还有消息也一起删除voiddel_que(key_tkey){if(msgctl(key,IPC_RMID,NULL)){perror("msgsnd\n");exit(1);}}

msg.h

#ifndefMSG_H#defineMSG_H#include<sys/types.h>#defineTEXTSIZE100#defineARRYSIZE2#defineMYTYPE_ONE1#defineMYTYPE_TWO2structMSG{longmytype;charmytext;};intopen_msg(char*,int);voidmsg_send(key_t,char*,long);#endif//endMSG_H
页: [1]
查看完整版本: unix XSI IPC-消息队列例程