主机论坛_虚拟主机_美国主机_美国虚拟主机_云主机技术_全球主机交流聚集地—Web Hosting Talk 中文站

找回密码
立即注册
发新帖

0

收听

5

听众

991

主题
发表于 2022-8-2 14:11:34 | 查看: 658| 回复: 0
注意事项:
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[TEXTSIZE];};intopen_msg(char*,int);voidmsg_send(key_t,char*,long);#endif//endMSG_H
云专线 海外专线 http://www.vecloud.com

收藏回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|小黑屋|WebHostingTalk中文站

GMT+8, 2024-4-27 14:23 , Processed in 0.089230 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表