消息队列

一.主要流程

1.ftok生成键值

2.msgget创建消息队列

3.msgsnd向队列里发送数据

4.msgrcv向队列里读取消息

5.msgctl删除消息队列

二.函数用法及参数

1. key_t ftok(const char *pathname, int proj_id);   生成键值
	参数一:路径    参数二:任意值
2.int msgget(key_t key, int msgflg); 创建消息队列
	参数一:key	参数二:一般为IPC_CREAT
3.int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
	参数一:msgget返回的id值	参数二:发送的数据	
	参数三:发送数据的长度	参数四:一般为0
4.ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
	参数一:msgget返回的id值	参数二:读到哪
	参数三:读多长	参数四:消息类型	参数五:一般为0
5.int msgctl(int msqid, int cmd, struct msqid_ds *buf);
	参数一:msgget返回的id值	参数二	一般为IPC_RMID	参数三:一般为NULL

三.例子

1.发送端

struct msgbuf
{
        long mtype;
        char mtext[128];
};

int main()
{
        key_t key;
        key = ftok(".",1);
        struct msgbuf sendbuf = {888,"这个信息来自消息队列\n"};

        int msgId = msgget(key,IPC_CREAT|0777);
        if(msgId == -1){
                printf("创建队列失败\n");
        }
        msgsnd(msgId,&sendbuf,strlen(sendbuf.mtext),0);
        printf("发送成功\n");
        msgctl(msgId,IPC_RMID,NULL);
        return 0;
}

2.接收端

int main()
{
        key_t key;
        key = ftok(".",1);
        struct msgbuf readbuf;
        int msgId = msgget(key,IPC_CREAT|0777);
        if(msgId == -1){
                printf("创建队列失败\n");
        }
        msgrcv(msgId,&readbuf,sizeof(readbuf.mtext),888,0);
        printf("从队列中读到了:%s\n",readbuf.mtext);
        msgctl(msgId,IPC_RMID,NULL);
        return 0;
}

3.结果

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值