linux动态共享内存在不同的程序中

时间:2012-02-23 07:55:24

标签: c linux shared-memory

我在程序A中使用以下代码创建共享内存:

shm = shm_open("/mfs_hash_pool_container", O_CREAT|O_RDWR, 0666);

size = sizeof(struct mfs_hash_pool_container);

ftruncate(shm, size);

mfs_hash_pool_stat_p = (struct mfs_hash_pool_container *)mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, shm, 0);

我用它来存储哈希表。

另一个程序B将从程序A接收addr(mfs_hash_pool_stat_p + offset)发送,但我无法在B中写入。 这是否意味着我还必须在B中打开这个共享内存?有没有其他方法可以解决这个问题?因为我自动创建了这个内存。

谢谢你们。

4 个答案:

答案 0 :(得分:7)

您不能在其他程序中使用该地址。 B必须:

  • 获取文件描述符:shm_open("/mfs_hash_pool_container", O_RDWR, 0)
  • 映射文件描述符的内存:mmap就像A做

注意:

  • 您需要检查mmap的返回值(它可以返回MAP_FAILED
  • 您无需转换mmap
  • 的返回值

答案 1 :(得分:1)

单独的进程不共享内存,因此从A传递给B的地址不会指向共享内存段。每个进程必须单独调用shm_open()和mmap()段。

如果您有关于每个流程需要注意的细分的信息,请按照每个流程都知道的顺序将其打包到细分的开头。

答案 2 :(得分:0)

我不确定你的程序A和程序B是如何相关的,但如果你设法使用fork() + execve()组合从'A'产生'B',那么你不需要担心传递内存指针,因为两个进程都有相同的副本。

为了您的参考,我在IBM developerworks这里粘贴了一个很好的代码示例 -

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/mman.h>
#include <sys/wait.h>

void error_and_die(const char *msg)
{
    perror(msg);
    exit(EXIT_FAILURE);
}

int main(int argc, char *argv[])
{
    int r;

    const char *memname = "sample";
    const size_t region_size = sysconf(_SC_PAGE_SIZE);

    int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666);
    if (fd == -1)
        error_and_die("shm_open");

    r = ftruncate(fd, region_size);
    if (r != 0)
        error_and_die("ftruncate");

    void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (ptr == MAP_FAILED)
        error_and_die("mmap");
    close(fd);

    pid_t pid = fork();

    if (pid == 0)
    {
        u_long *d = (u_long *)ptr;
        *d = 0xdbeebee;
        exit(0);
    }
    else
    {
        int status;
        waitpid(pid, &status, 0);
        printf("child wrote %#lx\n", *(u_long *)ptr);
    }

    r = munmap(ptr, region_size);
    if (r != 0)
        error_and_die("munmap");

    r = shm_unlink(memname);
    if (r != 0)
        error_and_die("shm_unlink");

    return 0;
}

阅读上述链接中的完整文章,以便更好地了解共享内存!

答案 3 :(得分:-2)

默认情况下,进程不共享内存。如果您希望这2个进程进行通信或共享内存,则必须实现这一点。 Check this question.

另一种解决方案是使用线程,它们共享代码和内存。