【问题标题】: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 参数。

标签: c shared-memory


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 2016-02-24
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多