How to get memory address from shm_open?

前提是你 提交于 2019-12-25 00:21:56

问题


I want to share memory using a file descriptor with another process created via fork. The problem is that I get different address regions from mmap. I want that mmap returns the same address value. Only in such case I can be sure that I really share the memory.

Probably it is possible to use MAP_FIXED flag to mmap, but how to get memory address from shm_open?

Is it possible to share memory via shm_open at all?

Maybe shmget must be used instead?

This is the minimal working example:

#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;
}

Compile it with gcc test.c -lrt.

This is the output:

0x7f3247a78000
0x7f3247a70000

EDIT

If I try to use method described in comment, child does not see changes in memory made by parent. Why? This is how I do it:

In parent:

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);

In child:

...
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

See also this question: How to get memory address from memfd_create?

来源:https://stackoverflow.com/questions/50093733/how-to-get-memory-address-from-shm-open

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!