注意事项:
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>
int main(int argc, char** argv)
{
int queid = open_msg("/root",100);
while(1)
{
fputs("请输入要发送的类型:1 or 2\n", stdout);
int type;
scanf("%d",&type);
switch(type)
{
case MYTYPE_ONE:
{
msg_send(queid,"MYTYPE_ONE", MYTYPE_ONE);
break;
}
case MYTYPE_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);
return 0;
}
client.c
#include "msg.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int queid = open_msg("/root",100);
while(1)
{
fputs("请接收要发送的类型:1 or 2\n", stdout);
int type;
scanf("%d",&type);
switch(type)
{
case MYTYPE_ONE:
{
msg_rec(queid,MYTYPE_ONE);
break;
}
case MYTYPE_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);
return 0;
}
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"
//如果存在队列则打开,没有则创建
int open_msg(char* path, int id)
{
//获取IPC对象的一个键
key_t key = ftok(path, id);
if(-1 == key)
{
perror("ftok\n");
exit(1);
}
//创建一个队列
int queid = msgget(key, IPC_CREAT|0666);
if(-1 == queid)
{
perror("msgget\n");
exit(1);
}
return queid;
}
//发送消息到队列
void msg_send(key_t key,char* text, long msgtype)
{
//初始化内容
struct MSG tmp;
memset(&tmp,sizeof(struct MSG),0);
tmp.mytype = msgtype;
strcpy(tmp.mytext,text);
//发送消息
if(msgsnd(key, &tmp, TEXTSIZE, 0))
{
perror("msgsnd\n");
exit(1);
}
}
//从消息队列获取消息并显示
void msg_rec(key_t key,long msgtype)
{
struct MSG tmp;
if(-1 == msgrcv(key, &tmp, TEXTSIZE, msgtype, MSG_NOERROR))
{
perror("msgrcv\n");
exit(1);
}
printf("receive content: %s\n",tmp.mytext);
}
//删除队列,即使队列里面还有消息也一起删除
void del_que(key_t key)
{
if(msgctl(key,IPC_RMID,NULL))
{
perror("msgsnd\n");
exit(1);
}
}
msg.h
#ifndef MSG_H
#define MSG_H
#include <sys/types.h>
#define TEXTSIZE 100
#define ARRYSIZE 2
#define MYTYPE_ONE 1
#define MYTYPE_TWO 2
struct MSG
{
long mytype;
char mytext[TEXTSIZE];
};
int open_msg(char*,int);
void msg_send(key_t,char*,long);
#endif // end MSG_H
附件:http://down.51cto.com/data/2362206
©著作权归作者所有:来自51CTO博客作者xieyihua的原创作品,如需转载,请注明出处,否则将追究法律责任
消息队列
共同学习,写下你的评论
评论加载中...
作者其他优质文章