学习笔记-----消息队列 (MSG)

      消息队列提供一种带有数据标识的特殊管道,使得每一段被写入的数据都变成带标识的 消息,读取该段消息的进程要指定这个标识就可以正确地读取,而不会受到其他消息的干 扰,从运行效果来看,一个带标识的消息队列,就像多条并存的管道一样。

消息队列相当于增强的管道,给不同进程发的消息做一个标识,进程在读的时候能够只读指定的标识的消息,进而区分不同进程。

标识是通过一个结构体

struct msgbuf {

   long msgtype;       /* message type, must be > 0 */

   char buf[128];    /* message data */

};

long msgtype是必须的,做标识只需要往这个结构体里的msgtype成员赋值,

这个值必须大于0。

发送消息msgsnd(),

接受消息msgrcv(),要传整个结构体的地址,跟传的参数标识做对比。

发送消息代码示例:

#include "test_msg.h"  //自己定义了一个头文件,里面包含所有需要的头文件

struct msgbuf{
    long mtype; //消息标识,必须大于0
    char mtext[128];  //消息内容
};

int main(){
    int msgid=msgget(ftok("./",1),IPC_CREAT|0666); //获取一个ip对象
    struct msgbuf mymsg;

    while(1){
        bzero(&mymsg.mtext,128);
        fgets(mymsg.mtext,128,stdin);
        mymsg.mtype=1;
        msgsnd(msgid,&mymsg,strlen(mymsg.mtext),0);
    }
}

           接受消息代码示例:

#include "test_msg.h"  //自己定义了一个头文件,里面包含所有需要的头文件

struct msgbuf{
    long mtype; //消息标识,必须大于0
    char mtext[128];  //消息内容
};

int main(){
    int msgid=msgget(ftok("./",1),IPC_CREAT|0666); //获取一个ip对象
    struct msgbuf mymsg;

    while(1){
        bzero(&mymsg.mtext,128);
        mymsg.mtype=1;

        msgrcv(msgid,&mymsg,128,1,0);
        printf("%S",mymsg.mtext);
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值