gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:28:52 25 4
gpt4 key购买 nike

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

例如:

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

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

最佳答案

共享内存是 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); };

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

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;

并使用它。 (不要忘记关闭)。

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

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

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

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

关于c - 如何将变量放入共享内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43923518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com