现在,我只是一次只关注它一个问题,而目前,我只是试图将我的循环列表放入共享内存区域.
到目前为止,我有:
typedef struct file{ struct file *f_link; /* forward link for linked List */ char name[255]; /* name of the file */} file_entry;
作为我的结构,它将保存对下一个文件的引用(f_link).通过这种方式,我可以调用 – > f_link来获取列表中的下一个项目,并且第10个元素将使其f_link直接返回到第1个.我这样做的原因是我可以在没有迭代器的情况下简单地遍历列表(并且不必像使用数组那样检查列表的结尾).
我也知道我需要使用shmget来获取内存区域,我理解它,我传递shmget一个键,一个大小和一个标志(我没有得到),它返回一个int类型的标识符.
所以我的问题是2折.如何将链接列表存储到共享内存区域 – 如何从共享内存区域访问它?
解决方法 shmget只保留一定数量的共享内存 – 比如在磁盘上创建固定大小的文件.标志是低9位的权限掩码(类似于open模式参数)加上一些额外标志IPC_CREAT和IPC_EXCL,对应于O_CREAT和O_EXCL用于打开.要实际访问该内存,您需要将其映射到进程的地址空间(“附加”它 – 类似于文件的mmap).这是使用shmat(返回指针)完成的.然后,您需要从该指针分配您的file结构.整个过程看起来像这样:int ID;file_entry *entrIEs;ID = shmget(key,N * sizeof(file_entry),IPC_CREAT | 0644);entrIEs = (file_entry *) shmat(ID,NulL,0);// you can Now access entrIEs as if it was a N-element array.// to turn it into a circular List,link the entrIEs appropriately.
映射后,您可以像常规内存一样使用它 – 因为它是常规内存.这就是重点!
编辑:我忘了提一个重要的警告.将链接列表放入这样的共享内存段只有在所有相关进程将其映射到同一地址时才有效!所以你需要这样做(使用shmat的第二个参数)或者从指针切换到相对于共享内存范围的基地址的偏移量.这意味着将下一个字段从指针转换为ptrdiff_t,并在加载时添加映射内存范围的基地址(并在存储时减去它).
总结以上是内存溢出为你收集整理的如何在C中将结构存储和检索到共享存储区中全部内容,希望文章能够帮你解决如何在C中将结构存储和检索到共享存储区中所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)