小编Den*_*.R.的帖子

调整POSIX共享内存的大小.一个工作的例子

我在POSIX模型中有两个不同应用程序之间的共享动态数组.我希望有能力改变它的大小而不复制.不幸的是我无法找到正确的解决方案来增加和减少C语言中的POSIX共享内存.在网络上,我发现很多文档都有不好的解释和可怜的例子.我设法找到了一些有趣的话题,但所有这些话都不适合我:

  1. "Linux系统编程" - "将文件映射到内存"部分:"调整映射大小" - 没有工作示例来调整SHM的大小.

  2. 如何实现动态共享内存大小调整? - 仅供参考.没有例子.

  3. mremap函数无法分配新内存 - 收藏的答案有误.

  4. 快速调整mmap文件的大小

  5. Linux中mremap功能的特点

  6. mremap函数无法分配新内存

  7. c/linux - ftruncate和POSIX共享内存段 - rszshm根本不使用mremap().它复制内存.最坏的方式.

我已经开发了一个例子,因为我理解文档.不幸的是它无法正常工作.请给我一个建议,我错了.请非常友好地给我一个有效的例子.

在文档中我发现我必须在mremap()之前使用ftruncate(),但是我找不到使用它们的正确语法.此外,mremap()适用于对齐的内存页面.在这种情况下如何正确增加共享内存?

/* main.c */
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <errno.h>

int main(void)
{
    size_t size_of_mem = 1024;
    int fd = shm_open("/myregion", O_CREAT | O_RDWR,
                      S_IRWXO | S_IRUSR | S_IWUSR);
    if (fd == -1)
    {
        perror("Error in shm_open");
        return EXIT_FAILURE;
    }

    if (ftruncate(fd, size_of_mem) …
Run Code Online (Sandbox Code Playgroud)

c linux mmap shared-memory

10
推荐指数
1
解决办法
2162
查看次数

当我仅从静态构建程序使用共享内存时出现分段错误

当我使用 --static 选项构建程序并调用 shm_open() 函数时,出现分段错误。没有 -static 选项,一切都像魅力一样。

有人知道为什么吗?

下面我引用了一个大项目的调试信息和部分截断的源代码。

您可以评论/取消评论

#STATIC = -static
Run Code Online (Sandbox Code Playgroud)

Makefile 中的字符串来重现该错误。

$ gdb --args ./debug/示例sample017

GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Reading symbols from ./debug/example...done.
(gdb) run
Starting program: ./example sample017

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) backtrace
#0  0x0000000000000000 in ?? ()
#1  0x000000000049a2e3 in __shm_directory (len=0x7fffffffdca8) at ../sysdeps/unix/sysv/linux/shm-directory.c:124
#2  0x0000000000499ff3 in shm_open ()
#3  0x0000000000499d55 in read_shm (memory=0x6d1be0, share_name=0x6d1d20 "sample017") at main.c:51
#4  0x0000000000499efe in read_memory (memory=0x6d1be0, argc=0x7fffffffde0c, argv=0x7fffffffdf68) at …
Run Code Online (Sandbox Code Playgroud)

c linux shared-memory segmentation-fault

4
推荐指数
1
解决办法
2051
查看次数

标签 统计

c ×2

linux ×2

shared-memory ×2

mmap ×1

segmentation-fault ×1