Chinaunix首页 | 论坛 | 博客
  • 博客访问: 708680
  • 博文数量: 240
  • 博客积分: 3616
  • 博客等级: 大校
  • 技术积分: 2663
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-21 23:59
文章分类

全部博文(240)

文章存档

2013年(6)

2012年(80)

2011年(119)

2010年(35)

分类: LINUX

2010-11-09 17:31:41

在实际的linux应用程序的编写中,很多涉及到消息队列.请看下面的例子.
#include
#include
#include
#include
#include
#include
#include
#define BUFSZ 512
struct message
{
 long msg_type;
 char msg_text[BUFSZ]; 
};
int main()
{
 int qid;
 key_t key;
 int len;
 struct message msg;
 if((key=ftok(".",'a'))==-1)//根据不同的路径和关键表示产生标准的key
 {
  perror("ftok");
  exit(1); 
 }
 if((qid=msgget(key,IPC_CREAT|0666))==-1)//创建消息队列
 {
  perror("msgget");
  exit(1); 
 }
 printf("opened queue %d\n",qid);
 puts("please enter the message to queue:");
 if((fgets((&msg) ->msg_text,BUFSZ,stdin))==NULL)
 {
  puts("no message");
  exit(1); 
 }
 msg.msg_type=getpid();
 len=strlen(msg.msg_text);
 if((msgsnd(qid,&msg,len,0))<0)//添加消息队列
 {
  perror("message posted"); 
  exit(1);
 }
 if(msgrcv(qid,&msg,BUFSZ,0,0)<0)//读取消息队列
 {
  perror("msgrcv");
  exit(1);  
 }
 printf("message is :%s\n",(&msg)->msg_text);
 if((msgctl(qid,IPC_RMID,NULL))<0)//从内核中移走消息队列
 {
  perror("msgctl");
  exit(1); 
 }
 exit(0);
}
/*-------------------------------------------------------
1.消息队列就是一个消息的列表。用户可以从消息队列种添加消息,读取消息等。从这点
上看,消息队列具有一定的FIFO的特性,但是它可以实现消息的随机查询,比FIFO具有优
势。同时,这些消息又是存在内核中的,由"队列ID"来标适。
2.消息队列实现
消息队列的实现包括创建或打开消息队列,添加消息,读取消息和控制消息队列这四种操
作.其中创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统
消息队列数量的限制,添加消息使用的函数是msgsnd函数,它把消息添加到已打开的消息队
末尾;读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可
以指定取走某一条消息,最后控制消息队列使用的函数是msgctl,它可以完成多项。
3.msgget函数语法
1)所需要的头文件
#include
#include
#include
2)函数原型 int msgget(key_t key,int flag)
3)函数输入参数
Key:返回新的或已有的队列ID,IPC——PRIVATE
Flag:
4)函数返回值
成功:消息队列ID
出错:-1
4.msgsnd函数语法要点
1)所需要的头文件
#include
#include
#include
2)函数原型
int msgsnd(int msqid,const void *prt,size_t size,int flag)
3)函数输入参数
msqid:消息队列的队列ID
prt:指向消息队列的指针。该消息结构为msgbuf
struct msgbuf
{
 long mtype;//消息类型
 char mtext[1];//消息正文 
}
size:消息的字节数,不要以null结尾
flag:
IPC_NOWAIT:若消息并没有立即发送而调用进程会立即返回。
0:msgsnd调用阻塞直到条件满足为止
4)函数返回值
成功:0
出错:-1
5.msgrcv函数语法要点
1)所需要的头文件
#include
#include
#include
2)函数原型:int msgrcv(int msgid,struct msgbuf *msgp,int size,long msgtype,
int flag)
3)输入参数
msqid:消息队列的队列ID
msgp:消息缓冲区
size:消息的字节数,不要以null结尾
Msgtype:
0:接收消息队列中第一个消息
大于0:接收消息队列中第一个类型为msgtyp的消息
小于0:接收消息队列中第一个类型值不小于msgtyp绝对值且类型值又最小的消息
flag:
MSG_NOERROR:若返回的消息比size字节多,则消息就会截短到size字节,且不通知
消息发送进程
IPC_NOWAIT:若消息并没有立即发送而调用进程会立即返回
0:msgsnd调用阻塞直到条件满足为止。
函数返回值
成功:0
出错:-1
6.msgctl函数语法要点
1)所需要的头文件
#include
#include
#include
2)函数原型
int msgctl(int msgqid,int cmd,struct msqid_ds *buf)
3)函数输入参数
msqid:消息队列的队列ID
cmd:
IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中
IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。
IPC_RMID:从系统内核中移走消息队列。
buf:消息队列缓冲区
4)函数返回值
成功:0
出错:-1
7.实验:
[root@localhost the_eight_step]# gcc msg.c -o msg
[root@localhost the_eight_step]# ./msg
opened queue 0
please enter the message to queue:
hello
message is :hello
输入hello
打印hello
-----------------------------------------------------*/
阅读(868) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~