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)的主要内容,如果未能解决你的问题,请参考以下文章

带有 SysV 共享内存的异步 MPI

使用SysV信号量时不一致

fork(),C 中的共享内存和指针

是否可以在 Windows 中的 PHP 和 C 之间共享内存?

如何在python和C / C ++中使用共享内存

C中的基本共享内存程序