2015-03-31 67 views
0

假設我有一個緩衝液:故障寫入共享存儲器緩衝區用C

int * buffer; 

和這個緩衝器與多個進程(共享存儲器)共用。

如果我想從/到該緩衝區讀取/寫入,我該怎麼做?

我在問這是因爲我發現很多的信息和各種不同的方法來解決這個問題,但答案缺乏組織,並變得非常混亂,難以理解。

下面是我用來創建共享內存段的功能:

void * create_shared_memory(char *name, int size) { 

    int *ptr; 
    int ret; 

    int fd = shm_open (name, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 

    if (fd == -1) { 
     perror ("shm_open error!"); 
     exit (1); 
    } 

    ret = ftruncate (fd, sizeof (size)); 

    if (ret == -1) { 
     perror ("ftruncate error!"); 
     exit (2); 
    } 

    ptr = mmap(0, sizeof (size), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 

    if (ptr == MAP_FAILED) { 
     perror ("shm-mmap error!"); 
     exit (3); 
    } 

return ptr; 

} 
+1

內存如何共享?你使用'pthread',OpenMP還是其他?還是你的意思是內存需要跨代碼共享? – wolfPack88 2015-03-31 14:45:03

+0

@ wolfPack88我編輯過! – laker001 2015-03-31 14:46:45

+0

有什麼問題?一旦你使用了'mmap',你就可以像往常一樣訪問內存。 – teppic 2015-03-31 14:55:12

回答

1

已經創建並映射一個共享內存段,從而獲得一個指向它,你讀或通過該指針被寫入。就語法和機制而言,這與任何其他內存相同。你可以用任何你喜歡的方式來包裝函數,但你本質上並不需要這樣做。

隨着EOF的觀察,共享內存語義比非共享內存語義複雜得多。您需要在共享內存訪問周圍使用適當的同步幫助,以確保線程和/或進程正確協作,否則結果未定義。