2017-09-26 58 views
0

我正在使用分叉的服務器上工作,它在共享內存中存儲一​​個字符串映射(k-> v)。我想這樣做非常簡單,但是我失去了指針以及我需要複製的東西。所以我提取相關的代碼看起來像這樣:C:將結構與字符串複製到共享內存

struct key_value { 
    char key[32]; 
    char value[32]; 
}; 

struct key_value **map; 
int *map_size; 

int shmid = shmget(IPC_PRIVATE, sizeof(struct key_value**), 0600); 
map = (struct key_value**) shmat(shmid, 0, 0); 
int shmid_size = shmget(IPC_PRIVATE, sizeof(int), 0600); 
map_size = (int*) shmat(shmid_size, 0, 0); 
*map_size = 0; 
//the above happens before fork() 

char *c = "abc"; 

int shmid_struct = shmget(IPC_PRIVATE, sizeof(struct key_value*), 0600); 
struct key_value *entry = (struct key_value*) shmat(shmid_struct, 0, 0); 
*entry->key = *c; 

printf("%s\n", map[0]->key); 

//smhdt's & shmctl's 

所以,我要的是該字符串​​從*c複製到map所以到共享內存中。顯然,我還沒有完全理解指針和結構,因此希望有人能夠清除它。我目前得到一個segfault'主'(謝謝gdb ...)。

請注意,我現在確定具有固定max_size的地圖(雖然動態的話會很棒)。

編輯:在一個答案中指出,在結構中有一個char*很困難,所以用char [x]來代替。已更新代碼以反映這一點,但仍無法正常工作。

+0

不要那樣做....閱讀更多,特別是[shm_overview(7)](http://man7.org/linux/man-pages/man7/shm_overview.7.html) –

+1

您最新的編輯完全改變了問題。這沒有意義。停下來。 –

回答

3

包含指針的結構不能安全地存儲在共享內存中,因爲指針在創建它們的過程之外沒有意義。即使共享內存區域映射到每個進程中的相同地址(如果內存映射在fork()之前,但在其他場景中可能爲false),則指向非共享內存的指針將不會正常運行,因爲每個進程在該地址可能有不同的數據。

如果要將字符串存儲在共享內存中,則需要將它們存儲爲顯式字符數組,例如,

struct key_value { 
    char key[32]; 
    char value[32]; 
}; 

或者使用其他方案,例如將偏移量存儲到共享內存區域的字符串表中。

但是,一般來說,共享內存不是進行進程間通信的好工具。如果您的應用程序依賴於能夠在內存中共享數據,則線程可能是更好的方法。

+0

我的任務如前所述:在服務器上的進程之間共享一個映射(k-> v)。你看到比使用共享內存更簡單的解決方案嗎?我不能將文件存儲在文件中。此外,你能否提供一個在結構中使用鍵[32]的小型工作示例?只改變爲[32]不會使我的代碼工作,所以我仍然需要了解究竟需要複製什麼以及如何複製。 – Dimebag