1. 消息队列的相关函数
消息队列的实现包括创建或打开消息队列、添加消处、读取消息和控制消息队列这四种操作。其中创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制;添加消息使用的函数是msgsnd函数,它把消息添加到已打开的消息队列未尾;读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息;最后控制消息队列使用的函数是msgctl,它可以完成多项功能。
消息队列相关函数的语法如表 9‑6、表 9‑7、表 9‑8和表 9‑9所示:
1. 消息队列实例
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/msg.h>
#include<sys/ipc.h>
#include<unistd.h>
struct msg_data
{
long msg_type;
char msg_text[512];
};
int main()
{
int msgid;
key_t key;
int len;
struct msg_data msg;
if((key=ftok(".",'a'))==-1)
{
printf("error ftok\n");
return 1;
}
if((msgid=msgget(key,IPC_CREAT|0666))==-1)
{
printf("error msgget\n");
return 1;
}
puts("please enter the message to queue:");
if((fgets((&msg)->msg_text,512,stdin))==NULL)
{
puts("no message");
return 1;
}
msg.msg_type=getpid();
len=strlen(msg.msg_text);
if(msgsnd(msgid,&msg,len,0)<0)
{
printf("error msgsnd\n");
return 1;
}
if(msgrcv(msgid,&msg,512,0,0)<0)
{
printf("error msgrcv\n");
return 1;
}
printf("rev message is :%s",(&msg)->msg_text);
if(msgctl(msgid,IPC_RMID,NULL)<0)
{
printf("error msgct\n");
return 1;
}
return 0;
}
编译运行结果如下:
[root@localhost msg]# ./msgrs
please enter the message to queue:
how are you
rev message is :how are you
本文转载于唯C教育,【Linux基础】消息队列应用
http://www.weicedu.com/forum.php?mod=viewthread&tid=155&fromuid=4
(出处: http://www.weicedu.com/)
http://www.weicedu.com/forum.php?mod=viewthread&tid=155&fromuid=4
(出处: http://www.weicedu.com/)