shared-memory 相关问题

可由多个程序同时访问的内存

写入共享内存中的 numpy 数组失败超过特定大小阈值,但仅限于 IDE 中

我正在尝试实现一个共享的 numpy 数组以用于多处理。它在较小的数组上运行良好,但当我尝试使用 ~2.7GB numpy 数组(约 5.6Mx64 矩阵)时失败。过了一会儿...

回答 1 投票 0

非隔离和隔离CPU之间的IPC

我有 2 个 CPU - cpu1 和 cpu2。进程A(非实时)在cpu1上运行,进程B(实时)在cpu2上运行。我想通过使用 isolcpus 或tuned-profiles-realti 将 cpu2 与 Linux 调度程序隔离...

回答 1 投票 0

如何使用 xcb 访问共享内存

我正在尝试使用 xcb_shm_get_image_unchecked 抓取窗口部分的屏幕截图。我使用以下代码创建了共享内存: #包括 #包括 我正在尝试使用 xcb_shm_get_image_unchecked 抓取窗口部分的屏幕截图。我使用以下代码创建了共享内存: #include <cstdlib> #include <memory> #include <sys/shm.h> #include <xcb/shm.h> #include <xcb/xcb.h> #include <xcb/xcb_image.h> #include <xcb/xcb_pixel.h> #include <xcb/xproto.h> #include <spdlog/spdlog.h> const auto IMAGE_WIDTH = 640; const auto IMAGE_HEIGHT = 480; const auto SHM_SIZE = 4 * 1024 * 1024; auto main() -> int { std::unique_ptr<xcb_connection_t, decltype(&xcb_disconnect)> c( xcb_connect(nullptr, nullptr), &xcb_disconnect); if (!c) { spdlog::error("failed to connect to X server"); return EXIT_FAILURE; } auto roots_iter = xcb_setup_roots_iterator(xcb_get_setup(c.get())); if (roots_iter.rem == 0) { spdlog::error("no screen found"); return EXIT_FAILURE; } auto root = roots_iter.data->root; xcb_shm_seg_t shmseg = xcb_generate_id(c.get()); // xcb_shm_get_im auto shm_reply = xcb_shm_create_segment_reply( c.get(), xcb_shm_create_segment(c.get(), shmseg, SHM_SIZE, 0), nullptr); if (!shm_reply) { spdlog::error("failed to create shared memory segment"); return EXIT_FAILURE; } auto fds = xcb_shm_create_segment_reply_fds(c.get(), shm_reply); spdlog::info("found {} fds", shm_reply->nfd); for (int i = 0; i < shm_reply->nfd; i++) { auto err = xcb_request_check( c.get(), xcb_shm_attach_fd(c.get(), shmseg, fds[i], true)); if (err) { spdlog::error("failed to attach fd: {}", fds[i]); delete err; } } for (int i = 0; i < shm_reply->nfd; i++) { close(fds[i]); } xcb_shm_detach(c.get(), shmseg); return 0; } 第一个问题:在释放资源方面我做得对吗? 第二:如何访问共享内存段? 最后,我如何抓取根窗口的 640x480 屏幕截图?我是否走在正确的道路上: auto image = xcb_shm_get_image_reply( c.get(), xcb_shm_get_image_unchecked(c.get(), root, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, XCB_GC_PLANE_MASK, XCB_IMAGE_FORMAT_Z_PIXMAP, shmseg, 0), nullptr); if (!image) { spdlog::error("failed to get image"); xcb_shm_detach(c.get(), shmseg); return EXIT_FAILURE; } spdlog::info("image: size {}", image->size); delete image; 您必须调用 mmap 才能访问共享内存。来自 xcb_shm_create_segment_unchecked 的文档: 要求服务器分配共享内存段。服务器的回复将包含一个文件描述符,供客户端传递给 mmap()。 如何获得访问权限? 您必须调用 mmap(包括文件描述符)来告诉 mmap 在哪里找到由 X 服务器分配的内存区域。 你可以使用这样的东西来做到这一点: auto *shmem = mmap(nullptr, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fds[0], 0); if (shmem == MAP_FAILED) { ... // cleanup } close(fds[0]); 一旦您阅读了 mmap 的文档,这些论点应该是不言自明的。最后一个 0 只是意味着我们希望指针指向内存区域的开头。 当然,完成后别忘了munmap: munmap(p, SHM_SIZE); 最后,不需要xcb_shm_attach_fd(c.get(), shmseg, fds[i], true));。仅当您自己创建 mmap 文件并将其传递到 X 服务器以便它可以访问时才需要这样做。 第一个问题:在释放资源方面我做得对吗? 是的,你有 如何抓取根窗口的 640x480 屏幕截图? 您用于抓取图像的代码几乎是正确的。只需将 plane_mask 参数更改为 ~0 即可。要实际将字节转换为图像,您可以选择将其转换为最小公分母图像格式,例如 PPM。该代码如下所示: if (auto f = std::ofstream("/path/to/screenshot.ppm", std::ios::binary); f) { f << "P6\n" << IMAGE_WIDTH << " " << IMAGE_HEIGHT << "\n255\n"; const auto *const imageData = shmem; for (uint32_t rgb = 0; rgb + 4 <= image->size; rgb += 4) { auto b = imageData[rgb]; auto g = imageData[rgb + 1]; auto r = imageData[rgb + 2]; if (setup->image_byte_order == XCB_IMAGE_ORDER_MSB_FIRST) { std::swap(b, r); } f << r << g << b; } } 最终结果应该是位于 ppm 的 /path/to/screenshot.ppm 格式的图像。如果你没有办法查看它,imagemagick能够将ppm转换为png,这样你就可以这样查看。

回答 1 投票 0

使用 set.seed 并行 foreach 共享内存

正如在这个问题中看到的,在Windows中不可能在R中使用共享内存运行并行进程。因此,我设计了以下方法,使用一系列set.seed()来模拟...

回答 1 投票 0

R 中使用 set.seed 并行 foreach 共享内存

正如在这个问题中看到的,在Windows中不可能在R中使用共享内存运行并行进程。因此,我设计了以下方法,使用一系列set.seed()来模拟...

回答 1 投票 0

共享内存段与共享内存对象

共享内存对象(使用shm_open创建)和共享内存段(shmget)有什么区别? 它们是否有任何无法像共享内存 shmmax 那样进行调整的限制...

回答 3 投票 0

我可以在共享内存中存储 lua_State 吗?

我猜不会(或者,如果可能的话几乎肯定不值得我花时间)。 我的想法是构造一个包含 offset_ptr 的镜像对象,该对象也位于拥有

回答 2 投票 0

有没有更好的方法来检查boost共享内存段是否存在?

我能看到如何做到这一点的唯一方法是尝试访问它并捕获抛出的异常(如果它不存在)。 布尔值存在() { 使用命名空间 boost::interprocess; 尝试 { ...

回答 3 投票 0

如何使用Python代码中创建的共享内存并在Cpp中读取

下面是我的python代码,它正在将数据写入共享内存,并且已成功写入/dev/shm/my_shared_memory 写数据.py 导入映射 导入操作系统 # 创建共享内存段 操作系统

回答 1 投票 0

从共享内存中获取 int

在我当前的项目中,我必须使用 100 字节的共享内存区域,再加上紧随其后的一个整数,所以,我认为大约是 108。 但是,我似乎无法隔离这个 int。 我没有太多...

回答 1 投票 0

使用 LayoutKind.Explicit 访问 C# 中的嵌套结构

我有一个C#应用程序需要与Python共享一些二进制数据,并且我计划使用共享内存(内存映射文件)。因此,我需要两边都有相同的二进制结构......

回答 1 投票 0

python 多进程共享内存中的嵌套目录名称 - 无效参数

SharedMemory 似乎只支持平面名称,有谁知道为什么或有任何参考吗?我在网上查了很久,没有找到亲戚。 从多处理导入

回答 1 投票 0

当消费者在实时上下文中操作时,如何在共享内存中安全地实现环形缓冲区

我的情况是这样的:在 Linux 机器上,我有一个共享内存区域,其中包含音频样本的环形缓冲区。这个环形缓冲区的消费者是一个硬实时 Xenomai 音频回调,s...

回答 1 投票 0

Python:快速将 7 GB 文本文件加载到 unicode 字符串中

我有一个很大的文本文件目录——大约 7 GB。我需要将它们快速加载到 iPython 中的 Python unicode 字符串中。我总共有 15 GB 内存。 (我正在使用 EC2,所以我可以购买更多...

回答 3 投票 0

对于 cJSON,哪种方法更节省内存:单个 cJSON 对象还是 cJSON 数组?

我正在开发一个项目,使用 cJSON 库来处理 JSON 数据。我有一个场景,我需要表示成对的数值,并且我正在尝试优化内存使用情况。 我有...

回答 1 投票 0

在第二个多处理池中找不到多处理共享内存

在我的代码中,我在多处理池中生成数据,然后在另一个池中处理它。从现在起,我的实现一直是将数据保存在磁盘中,然后再加载。现在我想要

回答 1 投票 0

PHP - C 共享内存

我正在尝试从 PHP 写入内存地址并从 C 读取。我可以使用此从 PHP 成功写入并从 PHP 端再次读取; $key = ftok("shmfile", 't'); $shm_id = shmop_...

回答 1 投票 0

C 信号量和共享内存

我正在尝试分别使用一个生产者和一个消费者来开发经典的生产者-消费者循环缓冲区示例。 然而我遇到了一些问题,我不知道它们来自哪里......

回答 1 投票 0

将队列设计为共享内存

我正在尝试设计/实现一个(循环)队列(用C语言)作为共享内存,以便它可以在多个线程/进程之间共享。 队列结构如下: typedef 结构 _q ...

回答 2 投票 0

SharedArrayBuffer和Atomics如何实现并行?

ECMA-2017(ES8),大约一个月前刚刚完成,引入了 SharedArrayBuffer 和 Atomics。此处的链接显示某些浏览器已支持它们。 正如我们所知,它们的目的是允许......

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.