2010-11-24 102 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