【问题标题】:Sharing a struct with a pointer between two processes using `shm_open()`使用 `shm_open()` 在两个进程之间共享带有指针的结构
【发布时间】:2015-01-01 22:23:28
【问题描述】:

我有以下结构,

typedef struct arrays {
    int *array;
    int max;
    int min;
} array;

其中*array 指向动态分配的数组,maxmin 保存数组中的最大和最小数字。

我需要在两个进程之间共享这个结构的一个实例(我可以在 C 中使用“实例”这个词吗?),我应该首先使用shm_open() 来分配*array 指向的数组,然后再使用分配结构本身,还是有更好的方法来实现相同的结果?

【问题讨论】:

    标签: c arrays struct posix shared-memory


    【解决方案1】:

    我不知道它是否更好,但你可以只用一次分配来做到这一点:分配一个大缓冲区以包含结构数组,然后使array指向缓冲区+结构体的大小。

    【讨论】:

    • 我喜欢这个想法,我如何确保一切都指向它应该指向的方向?我了解如何使*array 指向结构之后,但我不明白如何使maxmin 起作用。
    【解决方案2】:

    你需要这样做。

    1. 在每个进程中使用 shm_open 来获取一个文件描述符。您必须在每个进程中传递 shm_open 相同的 name。该名称是共享内存区域与其他共享内存区域的区别。名称必须以斜杠开头:"/somename"
    2. 使用步骤1中获取的文件描述符调用mmap
    3. mmap 返回的地址是您的共享内存地址。它是随机的,在每个过程中都是不同的。
    4. 由于 3,您不能在共享内存区域内使用指针。您需要使用从共享内存开始的整数偏移量,或者完全取消间接寻址。例如,将整个共享内存区域视为一个整数数组。前两个单元格包含minmax,之后才是实际数字。
    5. mmap 将返回可用内存,您不需要静态分配任何缓冲区或使用 malloc

    【讨论】:

      【解决方案3】:

      好吧,第一个答案就像你告诉医生“我这样做会很痛”,而医生说“那就不要那样做!”

      假设您打算这样做,请记住 shm_open 使内存块可用于共享:如果您共享的内存中有指向 malloc 内存的指针,它将是指向某个随机地址的指针就其他进程而言,在堆中。您需要分配整个缓冲区,整个内存块,然后共享它。

      更新

      根据下面的问题,如果您想在运行时分配缓冲区,那么规范的方式是:

      #define HOWBIGISMYBUFFER (3*GAZILLION)
      char * buf;
      if((buf = malloc(HOWBIGISMYBUFFER)) == 0){
          /* make splodey noises and terminate */
      }
      /* now you have your buffer */
      

      当然GAZILLION 是在别处定义的。然而,这就是说,你不想这样做。您要实现的是可以共享的静态内存块,并且在堆上分配它会使您面临各种难以跟踪的错误。 (考虑一下,例如,您在程序 A 中分配内存,将其共享给程序 B,然后程序 B 通过缓冲区溢出破坏程序 A 的堆。或者考虑,如果程序 B 在程序 A 崩溃后继续运行怎么办?)

      您想要做的是创建一个 static 缓冲区。最简单的方法是制作一个.h 文件:

      /* my_buffer.h */
      char bfr[HOWBIGISMYBUFFER];
      

      然后将其包含在您想要共享内存的任何地方。 会做的是写一个模块:

      /* my_buffer.c */
      char bfr[HOWBIGISMYBUFFER];
      
      char * init(){ /* do your shm_open here and returna pointer to bfr */ } 
      

      【讨论】:

      • 你的意思是像嵌套的shm_opens 吗?我正在考虑它,但它破坏了代码的可读性。
      • 没有。看看函数原型:它需要一个 const char *。它希望您分配所有将要使用的空间。
      • 阅读并思考了一整天,我已经在 C 中成功实现了您的建议。
      • 我实际上知道理论上应该发生什么,但给予一点指导和来自不同 POV 的解释帮助我搞定了!
      • 是的,我只是混淆了 shm_open 和 mmap 本身。这就是你从事编程工作 50 年时发生的事情。
      猜你喜欢
      • 2014-03-16
      • 2013-05-07
      • 1970-01-01
      • 2013-10-12
      • 2013-12-24
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多