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

相关文章
|
存储 监控 Linux
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
【Linux IO多路复用 】 Linux下select函数全解析:驾驭I-O复用的高效之道
2573 0
|
算法 安全 网络安全
简单认识一下mbedTLS
简单认识一下mbedTLS
2100 0
|
Rust 算法 安全
【密码学】一文读懂HMAC
本文将来聊一聊基于哈希函数的消息认证码,在此之前,先来科普一下什么是 「消息认证码」 (MAC), 先来看一个简单的栗子
2332 0
【密码学】一文读懂HMAC
|
6月前
|
存储 数据采集 数据可视化
Java 大视界 -- 基于 Java 的大数据可视化在城市地下管网管理与风险预警中的应用(275)
本文系统阐述 Java 与大数据可视化技术在城市地下管网管理中的应用,涵盖数据采集、三维建模、风险预警及性能优化,结合真实案例提供可落地的技术方案。
|
IDE Java 编译器
java: 错误: 不支持发行版本 5 java: 错误: 不支持发行版本8 java: 错误: 不支持发行版本17
检查编译器配置:确保你的IDE或编译器已正确配置为使用正确的Java版本。可以在IDE的设置或项目属性中查找并更改Java编译器的版本。
1470 0
|
11月前
|
人工智能 自然语言处理 vr&ar
一句话爆改三维场景!斯坦福吴佳俊团队新作:场景语言,智能补全文本到3D的场景理解
斯坦福大学吴佳俊团队提出“场景语言”,通过程序、自然语言单词和嵌入三个组件,实现文本到3D场景的智能生成与理解。该方法能高效生成复杂逼真的三维场景,广泛应用于虚拟现实、游戏、电影等领域,具有更高的保真度和精确控制优势。文章地址:https://arxiv.org/abs/2410.16770
364 95
|
监控 安全 网络安全
外贸企业网站制作:使用WordPress搭建一个展示型的外贸企业网站
本篇主要介绍使用WordPress的CMS管理系统搭建企业外贸网站,也可以称为B2B外贸网站。外贸网站制作需要准备的资料和建站流程:域名申请注册、服务器性能选配、服务器管理工具、WordPress的安装、企业展示型主题的选择和安装、使用WordPress插件的完成网站所需的功能、监控服务器运行状态保证网站正常运行、利用白帽技术提升SEO排名、使用SEO工具对站内内容文章的持续更新优化,吸引更多的自然流量提高转化率和成单率。
外贸企业网站制作:使用WordPress搭建一个展示型的外贸企业网站
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
消息中间件 Unix Linux
C语言 多进程编程(五)消息队列
本文介绍了Linux系统中多进程通信之消息队列的使用方法。首先通过`ftok()`函数生成消息队列的唯一ID,然后使用`msgget()`创建消息队列,并通过`msgctl()`进行操作,如删除队列。接着,通过`msgsnd()`函数发送消息到消息队列,使用`msgrcv()`函数从队列中接收消息。文章提供了详细的函数原型、参数说明及示例代码,帮助读者理解和应用消息队列进行进程间通信。
|
安全 网络安全 网络架构
什么是端口转发?什么是端口映射?如何设置端口映射
端口映射与端口转发是网络配置中两个常被混淆的概念。端口映射是指将外部网络请求通过路由器转发至内部网络特定主机的过程,增强了内网安全性。而端口转发则是指路由器依据端口将外部请求定向至具体设备,实现内外网通信。两者虽相似,但应用场景和原理有所不同。通过工具如花生壳,可轻松设置端口映射,实现外网访问内网服务。
2574 1