2013-02-22 35 views
2

我想設置s段的共享內存來容納一個字符串數組。作爲這個數組的一個例子Linux shmget()函數在c + +

string example [] = {「This is」,「An Example」,「of strings」};

然後我嘗試調用shmget,這樣我就可以保留適當數量的os共享內存。

shmget的(IPC_PRIVATE,整型尺寸(例如),IPC_CREAT); //我希望這創建共享存儲器段

我發現這個site它說「關鍵參數是與相關聯的訪問值信號量ID「什麼是信號量ID,我如何創建一個。

這編譯使用g ++ -Wall,但我不知道如何檢查,看看它是否有。根據linux中的shm手冊,其中IPC_PRIVATE是我應該指定的類型「key_t」的東西。我的想法是我如何識別共享內存的關鍵,即指定一個字符串作爲共享內存名稱,或指定一個ID號碼。

閱讀手冊指出,shmget()返回一個「shmid」。同樣,儘管什麼是shmid,它是一個int,字符串,指針,還是它是一些特殊類型,這是我確定我的共享內存段的方式嗎?另外如果shmget()正在返回,我不需要將它分配給某些東西?

如果您可以推薦教程或概述,我會非常感激。除了上面的具體問題之外,我想要一個從fork()命令創建的線程訪問共享內存的例子。

我的最終目標是爲我的數組中的每個字符串生成一個線程,它將執行一種反轉。這只是一個小任務,開始使用共享內存和pthreads,因爲我沒有找到可以通過的教程。

+0

'shmget()'返回一個'int'(http://www.kernel.org/doc/man-pages/online/pages/man2/shmget.2.html)。所以'shmid'是一個整數。 – 2013-02-23 00:14:55

回答

1

好的,在我解釋所有小細節之前,通過共享內存共享數據時非常重要的一件事是,您瞭解實際放入共享內存的內容。

在你的榜樣,您有:

string example[] = {"This is", "An Example ", "of strings"}; 

你可能沒有想過很辛苦關於這一點,但你覺得如何acutal字符串存儲了「的std :: string」裏面?我不清楚在這個特定情況下的具體細節,但是一個相當典型的實現將是這樣的[這是簡化的,一個真正的「類字符串」是一個使用basic_string類作爲基礎的模板類聲明]。

class string 
{ 
    char *str; 
    int len; 
} 

所以,如果你複製example到共享內存中,那麼你將在你的共享內存,三個指針和三個整數。這些指針指向一些內存,幾乎肯定不在共享內存中......顯然,「其他進程」中的內存地址不會是你所期望的[至少如果這些字符串不是恆定的,並且你的進程在字符串被創建之前被分叉 - 但是如果字符串是常量和/或當叉發生時已經存在,那麼你並不需要共享內存,對吧?]

對此的典型解決方案是僅將數據存儲在共享內存中,即「普通舊數據」(因此沒有內部具有成員函數或指針的對象)。實現此目的的一種方法是「序列化」數據 - 如果要將數據存儲在文件中,則這與您要做的事情是一樣的。

這編譯使用g ++ -Wall,但我不知道如何檢查並看看它是否有 。根據linux中的shm手冊,其中IPC_PRIVATE是I 應指定「key_t」類型的內容。我的想法是關鍵將 作爲我如何識別共享內存,即指定一個字符串作爲 共享內存名稱,或在一個ID號。

您可以指定一個鍵或使用IPC_PRIVATE(這在男子頁爲「不幸名」進行了解釋,並說:「IPC_NEW」會是一個更好coice)

讀手動通過指出shmget()返回一個「shmid」。 雖然什麼是shmid是一個int,字符串,指針還是它是一些特殊類型的 ,這是我確定我的共享內存段的方式嗎?另外如果shmget()返回的東西我不需要 分配給它的東西?

你鏈接到真正該網站介紹瞭如何存儲shmid

int shmid; 

... Several lines of code... 

if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { 

我想,這應該足以讓你開始。

+0

不知道,因爲我沒有測試過,但我認爲有可能使用std :: string類和一個自定義分配器和/或放置新數據將其數據放入shm區域......您是否認爲這是可能的? – Filipe 2013-02-27 02:59:19

+0

是的,但要注意共享內存在另一個進程中可能有不同的地址,所以如果是這樣的話,那麼普通的舊數據是您唯一的選擇。 – 2013-02-27 11:29:46