消息队列

消息队列是IPC对象的一种

消息队列由消息队列ID来唯一标识

消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等。

消息队列可以按照类型来发送/接收消息


消息队列的操作包括创建或打开消息队列、添加消息、读取消息和控制消息队列

创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制

添加消息使用的函数是msgsnd,按照类型把消息添加到已打开的消息队列末尾读取消息使用的函数是msgrcv,可以按照类型把 消息从消息队列中取走

控制消息队列使用的函数是msgctl,它可以完成多项功能。



在设置IPC_CREAT标志时,如果给出的是一个已有消息队列的键也不会产生错误,如果消息队列已有,则IPC_CREAT标志就被悄悄地忽略了。

成功:返回放到接收器缓存区中的字节数,消息被 复制后,消息队列中的对应消息给删除消息队列


列举

#define BUFSZ 512
#define TYPE 100
struct msgbuf{
long mtype;
char mtext[BUFSZ];
};
int main()
{
int qid, len;
key_t key;
struct msgbuf msg;
/*根据不同的路径和关键字表示产生标准的key*/
if((key = ftok(".", 'a')) == -1)
{
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.mtype = TYPE;
len = strlen(msg.mtext) + 1;/*添加消息到消息队列*/
if((msgsnd(qid,&msg, len, 0) < 0){
perror(“msgsnd");
exit(-1);
}
/*从消息队列读取消息*/
if(msgrcv(qid,&msg, BUFSZ, 0, 0) < 0){
perror("msgrcv");
exit(-1);
}
printf("message is:%s\n", (&msg)->mtext);
/*从系统中删除消息队列。*/
if(msgctl(qid, IPC_RMID, NULL) < 0){
perror("msgctl");
exit(1);
}
return 0;
}


例子2:(有两个进程,一个写进程和一个读进程)

写进程(消息入列):

#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#define IFILE "./file"
struct msgbuf{
        long mtype;//消息类型
        char mtext[10];//消息内容
};


int main()
{
        struct msgbuf m;
        m.mtype = 2;
        strcpy(m.mtext,"abcde");
        key_t k = ftok(IFILE,0);
        int msg = msgget(k,IPC_CREAT);

        msgsnd(msg,&m,sizeof(m.mtext),0);
}


读进程(消息出列):

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#define IFILE "./file"
struct msgbuf{
        long mtype;
        char mtest[10];
};

int main()
{
        struct msgbuf m;
        key_t k = ftok(IFILE,0);
        int msg = msgget(k,IPC_CREAT);

        msgrcv(msg,&m,sizeof(m),2,0);
        printf("m.mtype %ld , mtest %s",m.mtype,m.mtest);
        return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值