当前位置: 首页 > news >正文

DPDK多进程之间的通信

文章目录

    • 前言
    • 本机DPDK IPC API介绍
    • demo演示

前言

DPDK的主进程和辅助进程之间共享大页内存。关于DPDK多进程的支持文档介绍见:47. 多进程支持。

本文介绍本机DPDK的主进程和辅助进程之间交换短消息的API的使用。

前置要求:DPDK-Hello-World示例应用程序


本机DPDK IPC API介绍

具体的API接口使用,见API 手册。

第一种是消息。相关函数如下:

  • int rte_mp_sendmsg (struct rte_mp_msg *msg):发送消息。辅助进程调用该函数,发送单播消息到主进程。主进程调用该函数,发送广播消息到所有辅助进程。

第二种是请求。相关函数如下:

  • int rte_mp_request_sync (struct rte_mp_msg *req, struct rte_mp_reply *reply, const struct timespec *ts): 同步请求,阻塞直到收返回内容,可以设置等待时长。
  • int rte_mp_request_async (struct rte_mp_msg *req, const struct timespec *ts, rte_mp_async_reply_t clb): 异步请求。不会阻塞。
  • int rte_mp_action_register (const char *name, rte_mp_t action): 注册,消息/请求到来时,对应的响应函数。
  • void rte_mp_action_unregister (const char *name): 取消注册的响应函数。
  • int rte_mp_reply (struct rte_mp_msg *msg, const char *peer): 响应函数中,调用该函数,对请求做出回复。

不管时消息还是请求,都需要填充rte_mp_msg这个结构体。要填充的字段列表如下:

  • name- 消息名称。该名称必须与接收者的回调名称匹配。
  • param- 消息数据(最多 256 字节)。
  • len_param- 消息数据的长度。
  • fds- 与数据一起传递的文件描述符(最多 8 个 fd)。
  • num_fds- 要发送的文件描述符的数量。

可以看到,主辅进程之间可以传递文件描述符,这就很厉害了。消息一次最多传递256个字符,传递数据能力有限。但是通过文件描述符(如,socketpair创建的描述符),主辅进程通信起来就很方便了。


demo演示

不太会用,大概写了一个demo:(1)辅助进程发送消息给主进程,其中包含一段字符串和一个文件描述符。(2)主进程收到消息后,阻塞读取文件描述符。(3)辅助进程通过fd给主进程发送消息,最后关闭fd(发送EOF)。 (4)可以结合epoll/libevent进一步提高代码的灵活性。

完整代码见仓库。

辅助进程代码如下。

#include "common.h"
#include <rte_eal.h>
#include <rte_errno.h>int main(int argc, char *argv[]) {int ret;// 创建pipe管道int fd[2];ret = pipe(fd);if (ret < 0) {fprintf(stderr, "Failed to execute pipe function\n");return -1;}ret = rte_eal_init(argc, argv);if (ret < 0) {printf("Error message: %s\n", rte_strerror(rte_errno));return -1;}// 获取当前程序的名称char hello_msg_send[256];get_process_name(hello_msg_send, sizeof(hello_msg_send));strncat(hello_msg_send, ":Hi, I am secondary.",sizeof(hello_msg_send) - strlen(hello_msg_send) - 1);// 构建发送消息struct rte_mp_msg hello;strncpy(hello.name, "hello_register", sizeof(hello.name) - 1);strncpy(hello.param, hello_msg_send, sizeof(hello.param) - 1);hello.len_param = strlen(hello_msg_send);hello.fds[0] = fd[0];hello.num_fds = 1;ret = rte_mp_sendmsg(&hello);if (ret < 0) {printf("Error message: %s\n", rte_strerror(rte_errno));return -1;}// 通过pipe的fd,给primary发送内容const char *close_msg = "I(secondary) will close";int send_len = strlen(close_msg);int n = 0;while (n < send_len) {n += write(fd[1], close_msg + n, sizeof(close_msg));}close(fd[1]);return 0;
}

主进程代码如下。

#include "common.h"
#include <rte_eal.h>
#include <rte_errno.h>int secondary_fd = -1;int hello_msg_reply(const struct rte_mp_msg *msg, const void *peer) {printf("recv:");printf("%s\n", (char *)msg->param);printf("recv len %d\n", msg->len_param);secondary_fd = msg->fds[0];
}int main(int argc, char *argv) {int ret = rte_eal_init(argc, argv);if (ret < 0) {printf("Error message: %s\n", rte_strerror(rte_errno));return -1;}rte_mp_action_register("hello_register", hello_msg_reply);while (secondary_fd < 0) {sleep(1);}char buf[256];while (read(secondary_fd, buf, sizeof(buf) - 1)) {printf("%s\n", buf);}return 0;
}

运行输出如下。

sudo ./primary sudo ./secondary --proc-type=secondary# 主进程输入如下
recv:secondary:Hi, I am secondary.
recv len 29
I(secondary) will close

相关文章:

DPDK多进程之间的通信

文章目录 前言本机DPDK IPC API介绍demo演示 前言 DPDK的主进程和辅助进程之间共享大页内存。关于DPDK多进程的支持文档介绍见&#xff1a;47. 多进程支持。 本文介绍本机DPDK的主进程和辅助进程之间交换短消息的API的使用。 前置要求&#xff1a;DPDK-Hello-World示例应用程…...

Python文本信息解析:从基础到高级实战‘[pp]]‘[

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python文本信息解析&#xff1a;从基础到高级实战&#xff0c;全文3600字&#xff0c;阅读大约10分钟。 文本处理是Python编程中一项不可或缺的技能&#xff0c;覆盖了广泛的…...

c语言多线程队列实现

为了用c语言实现队列进行多线程通信&#xff0c;用于实现一个状态机。 下面是实现过程 1.实现多线程队列入栈和出栈&#xff0c;不加锁 发送线程发送字符1&#xff0c;接收线程接收字符并打印。 多线程没有加锁&#xff0c;会有危险 #include "stdio.h" #include …...

一分钟带你了解电容

电容器中的电容究竟是怎么定义的&#xff1f; 一个电容器&#xff0c;如果带1库的电量时两级间的电势差是1伏&#xff0c;这个电容器的电容就是1法拉&#xff0c;即&#xff1a;CQ/U 。但电容的大小不是由Q&#xff08;带电量&#xff09;或U&#xff08;电压&#xff09;决定…...

SQLAlchemy 第一篇

安装SQLAlchemy pip install SQLAlchemy查看当前版本 # 查看当前版本import sqlalchemyprint(sqlalchemy.__version__)2.0.23创建数据库连接 此处我们以pymysql为mysql的数据库驱动 安装pymysql pip install pymysqlfrom sqlalchemy import create_engine engine create_…...

Node.js模块化的基本概念和分类及使用方法

1.模块概念 模块&#xff1a;指解决一个复杂问题的时候&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来讲&#xff0c;模块是可以组合、分解和更换的单元。 在编辑领域中的模块&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成独立并且相互…...

SpringBoot整合Lucene实现全文检索【详细步骤】【附源码】

笑小枫的专属目录 1. 项目背景2. 什么是Lucene3. 引入依赖&#xff0c;配置索引3.1 引入Lucene依赖和分词器依赖3.2 表结构和数据准备3.3 创建索引3.4 修改索引3.5删除索引 4. 数据检索4.1 基础搜索4.2 一个关键词&#xff0c;在多个字段里面搜索4.3 搜索结果高亮显示4.4 分页检…...

基于ssm生活缴费系统及相关安全技术的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对生活缴费信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…...

VS的python没有pandas(VS连接mysql数据库)

import pandas as pd from sqlalchemy import create_engine# 初始化数据库连接 engine create_engine(mysqlpymysql://root:556localhost:3306/仓库)sql_chaSELECT * FROM 库房 print(sql_cha) df_read pd.read_sql_query(sql_cha, engine); print(df_read);VS连接mysql如上…...

Java实现pdf文件合并

在maven项目中引入以下依赖包 <dependencies><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-examples</artifactId><version>3.0.1</version></dependency><dependency><groupId>co…...

ArcGIS导入excel中的经纬度信息,绘制矢量

1.首先整理坐标信息 2.其次转成2003格式的excel文件 3.导入arcgis&#xff0c;点击右键添加excel数据 4.显示xy数据 5.显示经度和纬度信息 6&#xff1a;点击【地理坐标系】->【World】->【WGS 1984】->【确定】 7.投影带的确定方式&#xff1a; 因为自己一直…...

【Hadoop】

Hadoop是一个开源的分布式离线数据处理框架&#xff0c;底层是用Java语言编写的&#xff0c;包含了HDFS、MapReduce、Yarn三大部分。 组件配置文件启动进程备注Hadoop HDFS需修改需启动 NameNode(NN)作为主节点 DataNode(DN)作为从节点 SecondaryNameNode(SNN)主节点辅助分…...

GitHub帐户管理更改电子邮件

登录到您的 GitHub 帐户&#xff1a; 前往 GitHub 网站并使用您的凭据登录。 访问个人设置&#xff1a; 单击右上角的您的头像&#xff0c;然后选择“Settings”&#xff08;设置&#xff09;。 选择电子邮件选项卡&#xff1a; 在左侧边栏中选择“Emails”&#xff08;电子邮…...

InsCode实践分享

一、背景介绍 随着社交媒体的普及&#xff0c;越来越多的品牌和商家开始关注如何利用社交媒体平台来提高品牌知名度和销售额。其中&#xff0c;Instagram作为一个以图片和视频为主要内容的社交媒体平台&#xff0c;已经成为了很多品牌和商家进行营销的重要渠道。InsCode是Inst…...

大一C语言作业 12.14

1.A A&#xff1a;将pa指向的元素赋值给x&#xff0c;即x a[0] B&#xff1a;将a数组第二个元素的值赋给x&#xff0c;即x a[1] C&#xff1a;将pa指向的下一个元素的值赋给x&#xff0c;即x a[1] D&#xff1a;将a数组第二个元素的值赋给x&#xff0c;即x a[1] 2. 6 2 3 …...

微服务技术 RabbitMQ SpringAMQP P61-P76

B站学习视频https://www.bilibili.com/video/BV1LQ4y127n4?p61&vd_source8665d6da33d4e2277ca40f03210fe53a 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r 一 初始MQ 1. 同步通讯 2. 异步通讯 3. MQ常…...

BearPi Std 板从入门到放弃 - 先天神魂篇(3)(RT-Thread I2C设备 读取光照强度BH1750)

简介 使用BearPi IOT Std开发板及其扩展板E53_SC1&#xff0c; SC1上有I2C1 的光照强度传感器BH1750 和 EEPROM AT24C02&#xff0c; 本次主要就是读取光照强度; 主板: 主芯片: STM32L431RCT6LED : PC13 \ 推挽输出\ 高电平点亮串口: Usart1I2C使用 : I2C1E53_SC1扩展板 : LE…...

中文分词演进(查词典,hmm标注,无监督统计)新词发现

查词典和字标注 目前中文分词主要有两种思路&#xff1a;查词典和字标注。 首先&#xff0c;查词典的方法有&#xff1a;机械的最大匹配法、最少词数法&#xff0c;以及基于有向无环图的最大概率组合&#xff0c;还有基于语言模型的最大概率组合&#xff0c;等等。 查词典的方法…...

Docker容器数据卷

一、概念 1.定义 卷就是目录或文件&#xff0c;存在于一个或多个容器中&#xff0c;由docker挂载到容器&#xff0c;但不属于联合文件系统&#xff0c;因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。 卷的设计目的就是数据的持久化&#xff0c;完全独…...

chatGPT 国内版,嵌入midjourney AI创作工具

聊天GPT国内入口,免切网直达,可直接多语言对话,操作简单,无需复杂注册,智能高效,即刻使用.可以用作个人助理,学习助理,智能创作、新媒体文案创作、智能创作等各种应用场景! 地址&#xff1a; https://ai.wboat.cn/...

Midjourney玩具相机风格从翻车到封神:1个--v 6.1专属参数组合+2个隐藏式胶片颗粒注入指令+1套曝光补偿校准表

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney玩具相机风格的视觉本质与审美悖论 失真即真实&#xff1a;玩具相机的光学哲学 玩具相机&#xff08;Toy Camera&#xff09;风格在 Midjourney 中并非简单模拟 Lomography 或 Holga 的物理…...

告别python-pcl!用pclpy在Windows上轻松玩转PCL点云处理(Python 3.6/3.7保姆级教程)

告别python-pcl&#xff01;用pclpy在Windows上轻松玩转PCL点云处理&#xff08;Python 3.6/3.7保姆级教程&#xff09; 在三维视觉和机器人领域&#xff0c;点云处理一直是核心技术难点之一。PCL&#xff08;Point Cloud Library&#xff09;作为开源领域的标杆工具库&#x…...

5分钟轻松上手!DanmakuFactory弹幕神器让你的视频瞬间变有趣

5分钟轻松上手&#xff01;DanmakuFactory弹幕神器让你的视频瞬间变有趣 【免费下载链接】DanmakuFactory 支持特殊弹幕的xml转ass格式转换工具 项目地址: https://gitcode.com/gh_mirrors/da/DanmakuFactory 你是否曾经遇到过这样的困扰&#xff1a;精心收集的B站弹幕在…...

告别apt install:手把手教你为Ubuntu 20.04上的ROS2 Humble手动编译安装serial串口库

从ROS1到ROS2&#xff1a;深入解析串口库手动编译安装的技术内幕 在机器人操作系统(ROS)的演进历程中&#xff0c;ROS2的诞生标志着整个生态系统的重大升级。对于刚从ROS1迁移到ROS2的中级开发者而言&#xff0c;最直观的冲击莫过于包管理方式的变化。当你习惯性地输入apt inst…...

告别Canvas截图:用MediaProjection搞定Android状态栏和视频画面的完整截取方案

Android屏幕捕获终极方案&#xff1a;MediaProjection深度解析与实战 在移动应用开发中&#xff0c;屏幕捕获功能的需求日益增长&#xff0c;从用户反馈收集到操作演示录制&#xff0c;再到远程协作支持&#xff0c;这一功能已成为许多应用的核心竞争力。然而&#xff0c;传统基…...

你的参考文献规范吗?IEEE/Elsevier投稿前必查:LaTeX引用Early Access文章的正确姿势与避坑指南

IEEE/Elsevier投稿实战&#xff1a;LaTeX引用Early Access文献的终极解决方案 在学术出版的快节奏世界里&#xff0c;Early Access&#xff08;提前在线发布&#xff09;已成为主流期刊加速知识传播的重要方式。当你在深夜赶完论文最后一稿&#xff0c;突然发现参考文献列表里…...

Nodejs服务端如何配置Taotoken的OpenAI兼容SDK

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Nodejs服务端如何配置Taotoken的OpenAI兼容SDK 对于使用Node.js构建服务端应用的开发者来说&#xff0c;集成大模型能力正变得日益…...

Steam库存管理革命:5分钟掌握批量操作终极指南

Steam库存管理革命&#xff1a;5分钟掌握批量操作终极指南 【免费下载链接】Steam-Economy-Enhancer 中文版&#xff1a;Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/ste/Steam-Economy-Enhancer Steam Economy Enhancer…...

3大核心解决方案:彻底解决戴尔笔记本散热与噪音平衡难题

3大核心解决方案&#xff1a;彻底解决戴尔笔记本散热与噪音平衡难题 【免费下载链接】DellFanManagement A suite of tools for managing the fans in many Dell laptops. 项目地址: https://gitcode.com/gh_mirrors/de/DellFanManagement DellFanManagement是一款专为戴…...

别再手动绑骨了!用Mixamo+Unity 2022,5分钟搞定二次元角色动画(附材质修复全流程)

二次元角色动画高效制作指南&#xff1a;Mixamo与Unity 2022的完美配合 在独立游戏开发领域&#xff0c;角色动画制作往往是耗时最长的环节之一。传统手动绑骨流程不仅需要专业技能&#xff0c;还会消耗大量时间成本。对于二次元风格或Low Poly风格的独立游戏开发者来说&#x…...