How to put a variable in a shared memory? [duplicate]

谁都会走 提交于 2019-12-25 18:36:05

问题


I have a variable with a value and I want to share it with the proccesses.

Ex:

typedef struct {
  unsigned int a;
  unsigned int b;
  another_struct * c;
} struct1;
...
struct1 A ={...};
...

Now, I want to create a shared memory region and put the A variable in this region. How can i do this?


回答1:


Shared memory is an operating system feature (which does not exist in C11). It is not "provided" by the C standard.

I guess that you are coding for Linux. BTW, read Advanced Linux Programming.

Read first shm_overview(7). You'll need to synchronize, so read also sem_overview(7).

You'll get some shared memory segment into a pointer and you'll use that pointer.

First, open the shared memory segment with shm_open(3):

int shfd = shm_open("/somesharedmemname", O_RDWR|O_CREAT, 0750);
if (shfd<0) { perror("shm_open"); exit(EXIT_FAILURE); };

Then use mmap(2) on that shfd:

void* ad = mmap(NULL, sizeof(struct1), PROT_READ|PROT_WRITE, MAP_SHARED, 
                shfd, (off_t)0);
if (ad==MMAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); };

Then you can cast that address into a pointer:

struct1* ptr = (struct1*)ad;

and use it. (Don't forget to close).

BTW, you don't and you cannot put a variable into a shared memory. You get a pointer to that shared memory and you use it, e.g. ptr->a = 23;

Of course, don't expect the same shared segment to be mapped at the same address (so you can't easily deal with pointer fields like c) in different processes. You probably should avoid pointer fields in shared struct-s.

Notice that C variables exist only at compile time. At runtime, you only have locations and pointers.

PS. Shared memory is a quite difficult inter-process communication mechanism. You should perhaps prefer pipe(7)-s or fifo(7)-s and you'll need to multiplex using poll(2).




回答2:


Take a look at Beej's Guide to IPC.

I would basically treat the whole shard memory segment as a void* that you can place items at. You could use memcpy, of string.h, to copy A into your shared memory space. However your pointer in A would become invalid and cause a segfault if you attempted to use it in another process connected to shared memory segment.



来源:https://stackoverflow.com/questions/43923518/how-to-put-a-variable-in-a-shared-memory

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