【问题标题】:Cygwin/Cygserver Shared memoryCygwin/Cygserver 共享内存
【发布时间】:2017-08-21 02:56:59
【问题描述】:

我试图将一些共享内存代码从 CENTOS(3.5) 迁移到 CYGWIN(2.8.1, win10)。 共享内存通常是这样工作的:

  1. 通过 shmget 在进程中生成共享内存。

  2. 通过shmat将共享内存映射到该进程上并记录位置,然后将一些信息填充到内存中。

  3. 通过“shmat”将共享内存映射到另一个进程,传递最后记录的进程的位置,因为我们希望两个进程都将共享内存映射到相同的地址。

这里有一些代码来解释:

// one process
size_t size = 1024 * 1024;//1M
int id = shmget(IPC_PRIVATE, size, 0660);
char *madr = 0;
char *location = shmat(id, madr, 0);

// another process
char *location1 = shmat(id, location , 0);
// !!!we hope location1 and location should be the same!!!

在 Centos 上运行良好。

在 Cygwin 上,一个进程将共享内存映射到 0xffd90000,另一个进程与它不同,而是映射到 oxffdb0000。我们检查内存 0xffd90000 在该进程上是否可用。

【问题讨论】:

    标签: c cygwin shared-memory


    【解决方案1】:

    Linux 上也有错误的期望,请参阅
    https://linux.die.net/man/2/shmat

    请注意,以这种方式附加的共享内存段可能是 在不同的进程中附加在不同的地址。因此,任何 在共享内存中维护的指针必须是相对的 (通常到段的起始地址),而不是 绝对的。

    【讨论】:

    • 链接说:“如果 shmaddr 不是 NULL 并且在 shmflg 中指定了 SHM_RND,则附加发生在地址 等于 到 shmaddr 向下舍入到最接近的 SHMLBA 倍数. 否则 shmaddr 必须是发生附加的页面对齐地址。所以有可能两个进程可以在同一个地方映射内存。
    • 你没有使用任何 shmflg 值
    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2011-06-29
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多