2010-11-24 65 views
6

对于uni分配,我需要创建最多10个文件名的循环列表,然后将它们存储在共享内存区域中,以便2个孩子进程可以读/写列表(使用信号量来控制访问)。麻烦的是,我是一个总C新手,我感到失落和绝望,因为它完全超出了我的深度。我需要一些帮助来填补我的知识。如何在C中存储和检索结构到共享内存区域中

现在,我只是它在一个时间集中一个问题,目前,我只是试图让我的循环链表到共享存储区。

到目前为止,我有:

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倍。如何将链接列表存储到共享内存区域 - 以及如何从共享内存区域访问它?

回答

8

shmget只保留共享存储一定量的 - 像创建磁盘上的一个固定大小的文件。这些标志是低9位加上一些额外标志IPC_CREATIPC_EXCL(对应于O_CREATO_EXCLopen)的许可掩码(如mode参数open)。要实际访问该内存,需要将其映射到进程的地址空间(“附加”它 - 类似于文件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的第二个参数)或者从指针切换到相对于共享内存范围的基地址的偏移量。这意味着将您的next字段从指针变为ptrdiff_t,并在加载它时添加映射内存范围的基址(并在每次存储时减去它)。

+0

如果只有一个进程修改列表,而另一个进程只能读取(并且永远不会同时),那么您在答案底部突出显示的指针问题就不是什么问题了? – Ash 2010-11-24 05:41:51

2

你叫shmat(identifier, NULL, 0),取回一个指针到共享内存中的进程被映射到的位置。您可以在该位置创建您的对象,也可以在该位置创建对象。

你可能会发现Beej's Unix IPC guide有用的,它包含专门的共享内存的部分。

1

为你需要的,如果你想分配一个新的共享内存段指定至少IPC_CREATE的标志,否则会显得RAN现有segemnt的,如果它没有找到一个失败。

其次作为共享存储器段是你需要能够存储你FILE_entry结构的所有10一起连续的存储器块(或10个分配共享内存段! - 呸)。

所以你真的需要为至少10个FILE结构的数组记忆足够的内存。

最后文件和FILE_entry真的是坏名字!使用像MY_FILE_REF和MyFileRefEntry这样不太通用的东西。

2

shmget得到密钥后,您必须通过shmat来获得实际指针。下面是一些例子:

int shmid; 
key_t key; 
FILE* shm; 

shmid = shmget(key, sizeof(FILE) * 10, IPC_CREAT | 0666); 
shm = shmat(shmid, NULL, 0); 

这样,您就可以使用shm指针访问共享内存。在这个链接可以看到联机帮助页shmgetshmat

http://linux.die.net/man/2/shmget

http://linux.die.net/man/2/shmat

而看到http://www.cplusplus.com更多的参考。它也包含C参考。

我不知道我是否足够清楚,因此,请提出一些意见,如有必要,我会尽力为您提供指导。

编辑:在这个网站上,你可以找到一个非常简单的例子:http://simplestcodings.blogspot.com/2010/08/ipc-shared-memory-implementation-in-c.html

相关问题