如何将变量放入共享内存中? [复制]

Posted

技术标签:

【中文标题】如何将变量放入共享内存中? [复制]【英文标题】:How to put a variable in a shared memory? [duplicate] 【发布时间】:2017-05-11 18:53:46 【问题描述】:

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

例如:

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

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

【问题讨论】:

你应该create a shared memory region and put the A variable in this region 但是怎么做呢? shmget 期望键、大小和 shmflg 参数。 【参考方案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==MAP_FAILED)  perror("mmap"); exit(EXIT_FAILURE); ;

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

struct1* ptr = (struct1*)ad;

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

顺便说一句,您不这样做并且您不能将变量放入共享内存中。您会获得一个指向该共享内存的指针并使用它,例如ptr-&gt;a = 23;

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

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

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

【讨论】:

是的,我知道,但我想知道是否有任何方法可以将变量放入共享内存中。我可以创建一个共享内存区域,但我不能在其中放入变量。 您不能将变量放入共享内存中。你应该使用指针【参考方案2】:

看看Beej's Guide to IPC。

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

【讨论】:

问题标记为C @WeatherVane memcpy 存在于string.h 中,但它仍然有效。我将编辑我的答案以反映这一点。 我指的是std::memcpy

以上是关于如何将变量放入共享内存中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

将结构数组复制到共享内存中

将一组结构放入unix中的共享内存中,以便客户端程序可以访问它

将数据从全局加载到共享内存时如何避免银行冲突

从共享内存段复制数据会导致客户端出现段错误(信号量和共享内存)

Linux编程入门一System V共享内存

涉及多个进程的矩阵乘法中的共享内存