如何将变量放入共享内存?
How to put a variable in a shared memory?
我有一个带有值的变量,我想与进程共享它。
例如:
typedef struct {
unsigned int a;
unsigned int b;
another_struct * c;
} struct1;
...
struct1 A ={...};
...
现在,我想创建一个共享内存区域并将 A 变量放在该区域中。我该怎么做?
共享内存是 operating system feature (which does not exist in C11)。它不是由 C 标准“提供”的。
我猜你正在为 Linux 编码。顺便说一句,阅读 Advanced Linux Programming.
先阅读shm_overview(7). You'll need to synchronize, so read also 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
)。
顺便说一句,你不需要并且你不能将变量放入共享内存。你得到一个指向共享内存的 pointer 并使用它,例如ptr->a = 23;
当然,不要期望同一个共享段被映射到同一个地址(所以你不能轻易处理像c
这样的指针字段) 在不同的过程中。您可能应该避免共享 struct
-s.
中的指针字段
请注意,C 变量仅在编译时存在。在运行时,您只有位置和指针。
PS。共享内存是一个相当困难的inter-process communication mechanism. You should perhaps prefer pipe(7)-s or fifo(7)-s and you'll need to multiplex using poll(2).
我基本上会将整个碎片内存段视为可以放置项目的 void*
。您可以使用 memcpy
,共 string.h
,将 A 复制到您的共享内存 space。但是,如果您尝试在连接到共享内存段的另一个进程中使用它,A
中的指针将变得无效并导致段错误。
我有一个带有值的变量,我想与进程共享它。
例如:
typedef struct {
unsigned int a;
unsigned int b;
another_struct * c;
} struct1;
...
struct1 A ={...};
...
现在,我想创建一个共享内存区域并将 A 变量放在该区域中。我该怎么做?
共享内存是 operating system feature (which does not exist in C11)。它不是由 C 标准“提供”的。
我猜你正在为 Linux 编码。顺便说一句,阅读 Advanced Linux Programming.
先阅读shm_overview(7). You'll need to synchronize, so read also 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
)。
顺便说一句,你不需要并且你不能将变量放入共享内存。你得到一个指向共享内存的 pointer 并使用它,例如ptr->a = 23;
当然,不要期望同一个共享段被映射到同一个地址(所以你不能轻易处理像c
这样的指针字段) 在不同的过程中。您可能应该避免共享 struct
-s.
请注意,C 变量仅在编译时存在。在运行时,您只有位置和指针。
PS。共享内存是一个相当困难的inter-process communication mechanism. You should perhaps prefer pipe(7)-s or fifo(7)-s and you'll need to multiplex using poll(2).
我基本上会将整个碎片内存段视为可以放置项目的 void*
。您可以使用 memcpy
,共 string.h
,将 A 复制到您的共享内存 space。但是,如果您尝试在连接到共享内存段的另一个进程中使用它,A
中的指针将变得无效并导致段错误。