如何从shm_open获取内存地址?

时间:2018-04-30 03:56:14

标签: linux shared-memory mmap

我希望使用文件描述符与通过fork创建的另一个进程共享内存。 问题是我从mmap获得了不同的地址区域。 我希望mmap返回相同的地址值。只有在这种情况下,我才能确定我真正分享内存。

可能对MAP_FIXED使用mmap标记,但如何从shm_open获取内存地址?

是否可以通过shm_open分享内存?

也许必须使用shmget

这是最小的工作示例:

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
  /* Create a new memory object */
  int fd = shm_open( "/dummy", O_RDWR | O_CREAT, 0777 );
  if(fd == -1) {
    fprintf(stderr, "Open failed:%m\n");
    return 1;
  }

  /* Set the memory object's size */
  size_t size = 4096; /* minimal */

  if (ftruncate(fd, size) == -1) {
    fprintf(stderr, "ftruncate: %m\n");
    return 1;
  }

  void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if (ptr == MAP_FAILED) return 1;

  void *ptr2 = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if (ptr2 == MAP_FAILED) return 1;

  printf("%p\n%p\n", ptr, ptr2);

  return 0;
}

使用gcc test.c -lrt编译。

这是输出:

0x7f3247a78000
0x7f3247a70000

修改

如果我尝试使用注释中描述的方法,则子节点看不到父节点所做的内存更改。为什么?我就是这样做的:

在父母:

shm_data = mmap(NULL, shm_size, PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
...
snprintf(shared_memory, 20, "%p", shm_data);
execl("/path/to/prog", "prog", shared_memory, (char *) NULL);

在孩子:

...
void *base_addr;
sscanf(argv[1], "%p", (void **)&base_addr);
shm_data = mmap(base_addr, shm_size, PROT_READ, MAP_ANONYMOUS | MAP_SHARED | MAP_FIXED, -1, 0);
...

EDIT2

另请参阅此问题:How to get memory address from memfd_create?

0 个答案:

没有答案