如何将变量放入共享内存?

How to put a variable in a shared memory?

我有一个带有值的变量,我想与进程共享它。

例如:

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

现在,我想创建一个共享内存区域并将 A 变量放在该区域中。我该怎么做?

共享内存是 operating system feature (which does not exist in C11)。它不是由 C 标准“提供”的。

我猜你正在为 Linux 编码。顺便说一句,阅读 Advanced Linux Programming.

先阅读shm_overview(7). You'll need to synchronize, so read also sem_overview(7)

您将获得一些共享内存段到一个指针中,您将使用该指针。

首先用shm_open(3)打开共享内存段:

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

然后在 shfd 上使用 mmap(2):

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

然后您可以将该地址转换为指针:

struct1* ptr = (struct1*)ad;

并使用它。 (别忘了 close)。

顺便说一句,你不需要并且你不能将变量放入共享内存。你得到一个指向共享内存的 pointer 并使用它,例如ptr->a = 23;

当然,不要期望同一个共享段被映射到同一个地址(所以你不能轻易处理像c这样的指针字段) 在不同的过程中。您可能应该避免共享 struct-s.

中的指针字段

请注意,C 变量仅在编译时存在。在运行时,您只有位置和指针。

PS。共享内存是一个相当困难的inter-process communication mechanism. You should perhaps prefer pipe(7)-s or fifo(7)-s and you'll need to multiplex using poll(2).

看看Beej's Guide to IPC

我基本上会将整个碎片内存段视为可以放置项目的 void*。您可以使用 memcpy,共 string.h,将 A 复制到您的共享内存 space。但是,如果您尝试在连接到共享内存段的另一个进程中使用它,A 中的指针将变得无效并导致段错误。