Msgrcv 接收消息|学习笔记

简介: 快速学习 Msgrcv 接收消息

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频Msgrcv 接收消息】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11048


Msgrcv 接收消息

 

内容介绍:

一、接收消息

二、代码实现

 

一、 接收消息

1.格式

#include <sys/msg.h>

ssize _t msgrcv(int msqid , void *msgp , size_t msgsz ,long msgtyp, int msgflg);

2.功能:

从标识符为 msqid 的消息队列中接收一个消息。一旦接收消息成功,则消息在消息队列中被删除。

3.参数:

msqid:消息队列的标识符,代表要从哪个消息列中获取消息。

mSgp:存放消息结构体的地址。

mSgsz:消息正文的字节数。

msgtyp:消息的类型、可以有以下几种类型:(最好不要是0)

msgtyp =0:返回队列中的第一个消息

msgtyp >0:返回队列中消息类型为 msgtyp 的消息

msgtyp<0:返回队列中消息类型值小于或等于 msgtyp 绝对值的消息,如果这种消息有若干个,则取类型值最小的消息。

4.注意:

(1)若消息队列中有多种类型的消息, msgrcv 获取消息的时候按消息类型获取,不是先进先出的。

(2)在获取某类型消息的时候,若队列中有多条此类型的消息,则获取最先添加的消息,即先进先出原则。

(3)msgflg:函数的控制属性

0:msgrcv_ 调用阻塞直到接收消息成功为止。

MSG_NOERROR:若返回的消息字节数比 nbytes 字节数多,则消息就会截短到 nbytes 字节,且不通知消息发送进程。

IPC_NOWAIT:调用进程会立即返回。若没有收到消息则立即返回-1。

5.返回值:

成功返回读取消息的长度,失败返回-1.

 

二、代码实现

#include <stdio.h>

#include<unsitd.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include <sys / msg. h>

#include<string.h>

typedef struct msg {//定义一个结构体

long type ;//类型名,第一个必须是长整型

char text [200];

char name [20];

}MSG;       //新结构体的类型名为 MSG

int main(int argc, char *agrv[ ])

{

key_t key;//定义一个变量 key 值

MSG m;    //定义一个结构体变量 m

int masg_id;

int ret;    //定义一个整型变量 ret

key = ftok(“.”, 1); //当前目录加一得到 key 值

if(key == -1)

{

perror(“ftok”);

return 0;

}

printf(“key= %d\n” ,key);

msg_id = msgget(key ,IPC_CREAT|0666);

printf(“msg_id = %d\n” ,msg_id);

ret = msgrcv(msg_id ,&m, sizeof(m)-4,2,0); //接收消息,从msg_id 中获取消息,读取类型为2的消息

if(ret == -1)  //判断是否接收成功

{

perror(“msgrcv”);
return 0;

}

printf(“收到消息 %ld %s  $s\n”,m.type,m.text,m.name); //接收成功,打印出消息

ret = msgrcv(msg_id ,&m, sizeof(m)-4,3,0); //接收类型为3的消息

if(ret == -1)

{

perror(“msgrcv”);
return 0;

}

printf(“收到消息 %ld %s  $s\n”,m.type,m.text,m.name);

ret = msgrcv(msg_id ,&m, sizeof(m)-4,1,0);

//接收类型为1的消息

if(ret == -1)

{

perror(“msgrcv”);
return 0;

}

printf(“收到消息 %d %s  $s\n”,m.type,m.text,m.name);

return 0;

}

接收结果如下,可知不同类型的消息可以按类型读取(类型相同的消息按先进先出读取)

此时,队列中没有消息

image.gif

相关文章
|
编解码 Java 测试技术
消息类型-普通消息|学习笔记
快速学习消息类型-普通消息
169 0
消息类型-普通消息|学习笔记
|
消息中间件 存储 运维
【视频】普通消息 | 学习笔记
快速学习【视频】普通消息
496 0
【视频】普通消息 | 学习笔记
|
消息中间件 负载均衡 Java
下单消息的发送和接收案例|学习笔记
快速学习下单消息的发送和接收案例
212 0
下单消息的发送和接收案例|学习笔记
|
消息中间件 RocketMQ 开发者
发送同步消息|学习笔记
快速学习发送同步消息
108 0
发送同步消息|学习笔记
|
消息中间件 RocketMQ 开发者
测试发送消息和接受消息|学习笔记
快速学习测试发送消息和接受消息
141 0
测试发送消息和接受消息|学习笔记
|
移动开发 网络协议 测试技术
服务器循环接收客户端消息|学习笔记
快速学习服务器循环接收客户端消息
服务器循环接收客户端消息|学习笔记
|
消息中间件 网络协议
RabbiMQ中的消息回调与消息确认
和生产者的消息确认机制不同,因为消息接收本来就是在监听消息,符合条件的消息就会消费下来。 所以,消息接收的确认机制主要存在三种模式 1.自动确认 这也是默认的消息确认情况。AcknowledgeMode.NONE,RabbitMQ成功将消息发出(即将消息成功写入TCP Socket)中立即 认为本次投递已经被正确处理,不管消费者端是否成功处理本次投递 当自动应答等于true的时候,表示当消费者一收到消息就表示消费者收到了消息,消费者收到了消息就会立即从队列中删除 2.不确认(不介绍) 3.手动确认(多数选择的模式) 消费者收
|
消息中间件 Java 数据库
消息的和发送和接收|学习笔记
快速学习消息的和发送和接收
156 0
|
消息中间件 RocketMQ 开发者
发送单向消息|学习笔记
快速学习发送单向消息
|
消息中间件 RocketMQ 开发者
发送异步消息|学习笔记
快速学习发送异步消息
下一篇
无影云桌面