C 中的共享内存 (sysV)
Posted
技术标签:
【中文标题】C 中的共享内存 (sysV)【英文标题】:Shared Memory in C (sysV) 【发布时间】:2021-12-19 23:05:51 【问题描述】:struct shared_memory_t
int value1;
int value2;
char* buffer;
;
shmid = shmget(key, sizeof(shared_memory_t) + segsize, 0666|IPC_CREAT);
shared_memory_t* mem = (shared_memory_t*) shmat(*shmid, NULL, 0);
所以我试图将共享内存映射到自定义结构。现在我不知道 segsize 有多大,直到用户启动程序并输入一个值。我希望缓冲区是指向 int 值之后的内存空间开头的指针。现在,如果我这样做,我会遇到内存故障。我可以附加它并获取起始内存空间:
void* mem = shmat(shmid, NULL, 0);
关于如何在可以执行 mem->value1 并访问数据缓冲区以获取原始数据字节的状态下获得它的任何提示?
【问题讨论】:
您是否在手册中看到size
需要是内存页面大小的倍数?可能是 4096 的倍数。
还要检查shmget
的返回值,不要以为它就行了。
@Cheatah: size
不必是页面大小的倍数;系统会自动四舍五入。
【参考方案1】:
使用flexible array member:
struct shared_memory_t
int value1;
int value2;
char buffer[]; // flexible array member
;
shmid = shmget(key, sizeof(shared_memory_t) + segsize, 0666|IPC_CREAT);
shared_memory_t* mem = (shared_memory_t*) shmat(shmid, NULL, 0);
memset(mem.buffer, 42, segsize); // all valid
【讨论】:
在通读手册几个小时之后,真的就这么简单。谢谢!以上是关于C 中的共享内存 (sysV)的主要内容,如果未能解决你的问题,请参考以下文章