如何从memfd_create获取内存地址?

2024-03-02

在我的应用程序中我需要共享内存 父母和孩子之间(使用fork+execl)。 我用memfd_create分配内存,因为它提供了 文件描述符,可以方便地在子进程中使用 进程(描述符通过dup2 before execl) 附加到分配的内存。

我不使用write and read- 我使用指针 直接读写内存。

唯一有待解决的难题 就是如何获取分配的内存地址 通过fd = memfd_create ....

Using mmap是不可取的,因为它复制了内存,而不是提供了 内存地址已分配memfd_create.

下面的代码演示了这一点。 在其输出中每个mmap地址增加4096,这是内存的大小,由fd:

0x7f98411c1000
0x7f98411c0000

而如果mmap已给出直接地址, 输出中的地址将是相同的。

#include <stdio.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <unistd.h>
int main(void)
{
    int fd = syscall(SYS_memfd_create, "shm", 0);
    if (fd == -1) return 1;

    size_t size = 4096; /* minimal */

    int check = ftruncate(fd, size);
    if (check == -1) return 1;

    void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED) return 1;

    void *ptr2 = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr2 == MAP_FAILED) return 1;

    printf("%p\n%p\n", ptr, ptr2);

    return 0;
}

那么,如何获取直接地址,避免内存重复 经过mmap?


不确定您是否仍然需要答案,因为您已经在自己的答案中写下了要点,但只需添加以下内容即可确保其完整:

memfd_create 创建一个仅内存文件(这意味着它不存储在磁盘上,尽管它可以被换出)。当您写入答案时,它会返回一个文件描述符。

mmap 确保文件描述符后面的文件位于内存中(对于仅内存文件,无需执行任何操作),并为您提供指向该内存的指针。它不会复制内存(从磁盘映射文件时从磁盘到内存的情况除外)。如果同一文件被映射多次,则每次调用 mmap 都会保留一个新的虚拟内存区域,但所有这些区域都访问物理内存的同一部分。

所以你的问题的简短答案是你误解了 mmap;它不会复制内存,它是您问题的完美解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从memfd_create获取内存地址? 的相关文章

  • 为什么通过共享内存的通信比通过队列的通信慢得多?

    我在一台最近的老式 Apple MacBook Pro 上使用 Python 2 7 5 它有四个硬件和八个逻辑 CPU 即 sysctl 实用程序给出 sysctl hw physicalcpu hw physicalcpu 4 sysc
  • 无法在共享内存中使用运行时大小参数构造运行时 boost spsc_queue

    我想使用运行时指定的最大条目数在共享内存中创建一个无锁环形缓冲区 我的代码基于我在中找到的示例GitHub https gist github com sehe 9376856 我使用此代码成功在共享内存中创建了一个无锁环形缓冲区 就我而言
  • 我可以要求内核填充(故障)一系列匿名页面吗?

    在Linux中 使用C 如果我通过以下方式请求大量内存malloc或类似的动态分配机制 很可能支持返回区域的大多数页面实际上不会映射到我的进程的地址空间 相反 每次我第一次访问其中一个分配的页面时都会发生页面错误 然后内核将映射到 匿名 页
  • 如何可移植地扩展使用 mmap() 访问的文件

    我们正在尝试改变 SQLite 一个嵌入式数据库系统 使用 mmap 而不是通常的 read 和 write 调用来访问 磁盘上的数据库文件 对整个数据使用单个大映射 文件 假设文件足够小 我们没有问题 在虚拟内存中为此寻找空间 到目前为止
  • 共享内存和IPC [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在阅读有关共享内存的教程 发现以下陈述 如果一个进程希望通知另一个进程新数据已插入共享内存 则必须使用信号 消息队列 管道 套接字
  • 写入内存映射文件后,什么会更新 mtime?

    我在 Linux 上使用 XFS 并且有一个内存映射文件 每秒写入一次 我注意到文件 mtime 由watch ls full time 周期性但不规则地变化 mtimes之间的差距似乎在2到20秒之间 但并不一致 系统上几乎没有其他东西在
  • 为什么 POSIX mmap 不返回 volatile void*?

    mmap 返回 void 但不是volatile void 如果我使用 mmap 来映射共享内存 那么另一个进程可能正在写入该内存 这意味着从同一内存位置进行的两次后续读取可能会产生不同的值 这正是 volatile 所针对的情况 那么为什
  • 内存映射文件线程安全吗

    我想知道您是否可以使用多线程写入单个文件内存映射文件 http en wikipedia org wiki Memory mapped file 并确保两个线程不会写入同一区域 例如 通过交错固定大小的记录 从而减轻应用程序级别同步的需要
  • 检查 Linux 系统上 python 多处理中的 fork 行为

    我必须从许多进程中访问一组大型且不可选取的 python 对象 因此 我想确保这些对象没有被完全复制 根据评论this https stackoverflow com questions 5549190 is shared readonly
  • 将 IVSHMEM 与 libvirt virt-manager 结合使用

    Using ivshmem in qemu需要执行以下步骤 在主机中启动 ivshmem 服务器 ivshmem server这将创建一个unix域套接字 tmp ivshmem socket 使用以下命令行选项启动 qemu charde
  • 将内存映射与服务一起使用

    我构建了一个也可以作为服务运行的应用程序 使用 service 转变 当我从命令提示符运行服务时 这可以完美地工作 没有任何问题 我设置了一些设置 可以让我在不作为真正的服务运行时从控制台调试它 但是 当我尝试将其作为真正的服务运行然后使用
  • 通过 mmap 文件进行 IPC:应该使用原子和/或易失性吗?

    我使用 mmap 文件在进程之间共享数据 代码是这样的 struct Shared int Data int file open file dat O RDWR Shared shared static cast
  • 与 fork() 共享堆内存

    我正在努力用 C 语言实现一个数据库服务器 它将处理来自多个客户端的请求 我在用fork 处理单个客户端的连接 服务器将数据存储在堆中 堆由指向动态分配记录的哈希表的根指针组成 记录是具有指向各种数据类型的指针的结构 我希望进程能够共享这些
  • 读取超过 2^18 字节的惰性字节串时发生段错误

    考虑以下代码 http hpaste org 90394 http hpaste org 90394 我正在将一个 460mb 的大文件内存映射到一个惰性 ByteString ByteString 报告的长度471053056 When
  • 使用 mmap 访问 PCI-e 内存空间

    我在 Freescale MPC8308 处理器 基于 PowerPC 架构 上使用 PCI e 端口 在尝试使用它时遇到一些问题 端点 PCI e 设备的内存空间等于 256 MB 我可以使用 pciutils 包轻松读取和写入端点设备的
  • 将文件中的非连续块映射到连续内存地址

    我对使用内存映射IO的前景感兴趣 最好是 利用 boost interprocess 中的设施实现跨平台 支持 将文件中的非连续系统页面大小块映射到 内存中连续的地址空间 一个简化的具体场景 我有许多 普通旧数据 结构 每个结构都有固定长度
  • 如何在 App Engine 中灵活更改 /dev/shm 的大小

    如何更改共享内存文件夹的大小 dev shm在 App Engine 灵活应用程序中 默认情况下 它设置为 64M 太低 无法运行许多应用程序 例如 Chrome 我看不出有什么办法可以改变它 如果您有权访问 可以通过多种方法进行更改doc
  • 使用正在运行的进程的共享内存收集核心转储

    核心转储仅收集进程空间 而不收集为进程间通信创建的共享内存 如何使核心转储也包含正在运行的进程的共享内存 设置核心文件过滤器 proc PID coredump filter per http man7 org linux man page
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • 第二次ftruncate失败

    我试图在首次成功执行 shm open 和 ftruncate 后超出共享内存对象 这是代码 char uuid GenerateUUID int fd shm open uuid O RDWR O CREAT O EXCL S IRUSR

随机推荐

  • Android Lollipop 工具栏与自定义视图

    我刚刚读到 Android Lollipop 中的新工具栏 它继承自ViewGroup 为什么使用新工具栏比 LinearLayout 有优势 发表一下自己的看法 解释 你应该开始使用ToolBar而不是ActionBar 这直接取自 An
  • PHP-解析txt文件

    我有一个 txt 文件 其中包含以下详细信息 ID NAME DESCRIPTION IMAGES 123 test Some text goes here image 1 jpg image 2 jpg 133 hello some ot
  • 在 jQuery 中动态添加点击处理程序

    我有一个 MVC 应用程序 其中顶部菜单是动态构建的 如下所示 each data function index dataMenu if i 0 stringBuilder push li class home a href dataMen
  • PHP 在肥皂调用中重复元素

    我尝试从 PHP 进行肥皂调用时遇到问题 首先是一些背景信息 呼叫将转到一个在大型 CRM 系统上进行人员搜索的系统 它需要姓名 城市 出生日期等信息 成功时 应返回一个或多个 id 肥皂接口是系统的标准部分 因此我无法影响调用的布局 我首
  • Axon 框架:删除聚合根

    老实说 我不知道从哪里开始 存储库方面相对简单 但我似乎找不到任何有关如何通过 CommandGateway 删除聚合根的信息 任何有关如何实现这一目标的指示和 或文档将不胜感激 将其放在这里 以供其他可能像我最初一样迷失的人将来参考 使用
  • 如何通过对象内对象的改造来解析json数据?

    我在网上看到了很多用于改造的 JSON 示例 但无法找到我拥有的 json 结构类型 我无法解决它 我有以下 json 数据 我试图用 java 在我的 android 应用程序中显示它们 main data Date 2020 06 15
  • FFmpeg - 请求的输出格式“mpeg”不是合适的输出格式

    我正在尝试使用 FFmpeg 将视频从 mp4 格式转换为 mpeg 以便我可以合并多个视频 我有一个 FFmpeg 的自定义构建 我可以在其中控制配置选项 ffmpeg y i VID 20150514 171122 12085 mp4
  • Apache重写日志

    我收到 网页有重定向循环 错误 这很可能是由于我的 Apache 重写配置造成的 我以前遇到过这些问题 并且发现它们很难调试 是否有某种日志可以让我查看请求被重定向到的内容 如果没有 如何有效地调试 Apache 重写 如果您使用的是较新的
  • 如何为具有类型参数约束的泛型类型编写扩展方法?

    我正在使用特定于任务的 NET 平台 该平台是预编译的 而不是开源的 对于某些任务 我需要扩展此类 但不是通过继承它 我只是想添加一个方法 首先 我想向您展示一个虚拟代码现有类 public class Matrix
  • Android图像视图重力

    如何动态设置重力 Bitmap bmp im new ImageView this bmp getbmp img im setImageBitmap bmp 现在我想把图像放在顶部 我可以在没有的情况下做到这一点吗android gravi
  • 使用 AWS API Gateway 进行 API 版本控制

    我在使用 API Gateway Lambda 实现可行的版本控制方案时遇到问题 我的要求是在 API 级别进行主要版本控制 然后在服务级别进行次要版本控制 我的环境也分布在多个帐户中 因此暂存不是环境传播的选项 有人使用 AWS API
  • 如何构建 libjpeg 供 ndk 使用

    我下载了 libjpeg 8d 源代码 我想将其编译为 libjpeg so 可以在 android ndk 中使用 因为ndk使用arm架构 但我的PC的gcc是x86架构 所以当我使用gcc编译出libjpeg so并将其放入jni文件
  • 如何从终端重新加载 Google Chrome 标签?

    有没有办法仅使用终端在 Ubuntu 中重新加载 Google Chrome 选项卡 我不想只是打开一个新窗口 而是要实际刷新一个选项卡 额外问题 这在其他浏览器 例如 Opera Safari Firefox 中也可能吗 一个衬垫将聚焦
  • 如何将 django 调试工具栏设置为仅适用于某些用户?

    马上 是的 我知道 INTERNAL IPS 我即将在工作集成和测试中打开我的 Django 应用程序 我知道将会进行调试并进行大量修改和 或优化 所以我很乐意Django 调试工具栏 https github com django deb
  • 使用 URL 加载底部导航栏项目图标内的图像

    我正在尝试使用底部导航栏的项目图标内的 firebase 存储 url 加载个人资料图像 这是我的代码 Glide with getApplicationContext asBitmap load profilePicUrl into ne
  • AttributeError:尝试在 Discord.py 中创建按钮时,模块“discord”没有属性“ui”

    我想知道如何使用discord py 制作按钮 这将是我想要的一个例子 My Code import discord from discord ext import commands client commands Bot command
  • 如何知道按下的是什么字符键?

    我想知道在纯 Javascript 中以跨浏览器兼容的方式按下了什么字符键 清除 JavaScript function myKeyPress e var keynum if window event IE keynum e keyCode
  • 节省内存和编译时间

    有什么方法可以使用模块在 perl 中节省内存和编译时间吗 例如 不加载所有不必要的 未使用的子程序 或者 如果我将我的潜艇分成许多不同的 这是一个好方法pm文件 然后我只加载必要的模块 例如 usr bin perl w sub mysu
  • mkdir() 不工作

    My code mkdir some absolute path 0777 and mkdir relative path 0777 不起作用 安全模式已关闭 我什至尝试将所有父文件夹设置为 777 有任何想法吗 编辑 我确实打开了错误报告
  • 如何从memfd_create获取内存地址?

    在我的应用程序中我需要共享内存 父母和孩子之间 使用fork execl 我用memfd create分配内存 因为它提供了 文件描述符 可以方便地在子进程中使用 进程 描述符通过dup2 before execl 附加到分配的内存 我不使