在实际的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
-----------------------------------------------------*/
阅读(875) | 评论(0) | 转发(0) |