如何将变量放在共享内存中?

时间:2017-05-11 18:53:46

标签: c shared-memory

我有一个带值的变量,我想与proccesses分享。

例如:

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

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

2 个答案:

答案 0 :(得分:1)

共享内存是operating system功能(C11中不存在)。它不是"提供"按C标准。

我猜你正在编写Linux代码。顺便说一句,请阅读Advanced Linux Programming

先阅读shm_overview(7)。您需要同步,因此请阅读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==MMAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); };

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

struct1* ptr = (struct1*)ad;

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

顺便说一句,你不能和你不能将变量放入共享内存。您将 指针 添加到该共享内存并使用它,例如ptr->a = 23;

当然,不要期望将相同的共享段映射到同一地址(这样您就可以轻松处理指针字段,如c)在不同的过程中。您可能应该避免共享struct - s中的指针字段。

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

PS。共享内存是一个非常困难的inter-process communication机制。您可能更喜欢pipe(7) - s或fifo(7) - s,并且您需要使用poll(2)进行多路复用。

答案 1 :(得分:1)

看看Beej's Guide to IPC

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