如何将变量放入共享内存中? [复制]
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->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中的共享内存中,以便客户端程序可以访问它