代码之家  ›  专栏  ›  技术社区  ›  SF.

具有非空shmaddr的shmat

  •  3
  • SF.  · 技术社区  · 16 年前

    有人能提供一个(合理地)使用带有非空第二个参数的函数shmat()的例子吗?

    手册上说:

    #include <sys/shm.h>

    void *shmat(int shmid, const void *shmaddr, int shmflg);

    函数的作用是:将与共享内存标识符shmid相关联的共享内存段附加到调用进程的数据段。段附加在以下条件之一指定的地址:

    • 如果 shmaddr 是一个空指针,段附加在系统选择的第一个可用地址。
    • 如果 圣马德尔 不是空指针并且(shmflg&shm&u rnd)不是零,该段附加到(shmaddr-(shmaddr%shmlba))给定的地址。
    • 如果 圣马德尔 不是空指针并且(shmflg&shm&u rnd)为0,该段附加到shmaddr给定的地址。

    但是我从来没有看到过shmat与shmaddr一起使用的任何示例设置为空。在我的项目中,一个进程必须将它附加到 malloc() ‘ed内存片正常,可以正常使用,然后另一个进程获取指向该共享内存的指针(通过shmid),然后在尝试访问内存时出错。’

    2 回复  |  直到 16 年前
        1
  •  3
  •   Nikolai Fetissov    16 年前

    这里的想法是在不同的进程中将共享段放置在相同的虚拟地址,这样它们就可以使用普通指针(而不是偏移量)来处理共享内存中的项目。常见的场景是单个“主”进程将内存映射到内核提供的地址(第二个参数0),然后通过一些 带外 通道(例如带有fork/exec、unix socket、fifo等的命令参数),然后“workers”尝试在该地址映射段。同样,其思想是,如果内核能够在给定的va中为“master”映射共享内存,那么对于“worker”进程来说,相同的地址就可以了。

    我没有一个“合理”的例子。你可以看看 Postgres 使用共享内存。不过也有点牵扯其中。

        2
  •  0
  •   Douglas Leeder    16 年前

    我想这是为了让你可以共享一个结构,其中包含绝对指针。

    但我没有任何代码示例。