2015-02-08 38 views
0

我想分享我的C服務器上的一個結構的記憶,得到了下面的代碼交流電插座/客戶端fork()的,共享內存結構

// Before the main 
struct Esami { 
    char nome[20]; 
    char cognome[20]; 
    char matricola[20]; 
    char voto[20]; 
}; 

struct Appelli { 
    int stato; 
    char dipartimento[20]; 
    char cdl[20]; 
    char nomeEsame[20]; 
    char data[20]; 
    struct Esami esame[10]; 
    int numEsamiRegistrati; 
} *appello[100]; 

這是我在我的叉子做:

// After creating socket, bind(), listen() and so on.. 
if ((pid = fork()) == 0) { 
    shmid = shmget(2009, sizeof(appello), 0666 | IPC_CREAT); 
    *appello = shmat(shmid, 0, 0); 
    close (listenfd); // Closes the parent socket 
    // Operations on this struct (like the one I explained below) 
    exit(0); 
} 

我嘗試使用箭頭操作符來訪問該結構的領域,但該計劃可能得到一個內存錯誤,所以如果我填充字段,然後重例如

printf("Dipartimento: %s", appello[0]-> dipartimento); 

服務器程序崩潰:來自客戶端的其他每個輸入都不會被讀取。我設法使用單個結構變量(如* appello)來處理它,但是一旦我開始使用數組(* appello [100]),我就會遇到這個問題。

問題是:如何將此數組結構的內存段共享給連接到服務器的每個客戶端?

請注意,我試圖瞭解大學的練習,我必須用共享內存和分叉解決它。

+0

爲什麼你不在串口上(serialize)(http://en.wikipedia.org/wiki/Serialization)你的數據結構?另請參閱[這個答案](http://stackoverflow.com/a/28373401/841108)到一個相關的問題... – 2015-02-08 19:46:07

回答

1

首先只是在你的榜樣評論:

`printf("Dipartimento: %s", appello[0]-> dipartimento);`  
this space does not belong in any form^ 

注:,爲下面的評論,我沒有你的struct成員struct Esami esame[10];的定義,所以不得不簡化所有插圖中結構的表示。

下一點,對於一個不同的方法,改變的圖示:

struct Appelli { 
    int stato; 
    .... 
    int numEsamiRegistrati; 
} *appello[100]; 

typedef struct { 
    int stato; 
    .... 
    int numEsamiRegistrati; 
} APPELLO; 
APPELLO appello[100], *pAppello; 

在main()(或在任何執行代碼的能部)執行該初始化:

pAppello, = &appello[0];//initializes your pointer to a copy of struct 
pAppello = malloc(sizeof(APPELLO)); 

然後,使用指針時,基準構件是這樣的:

pAppello->cdl;//use -> for pointer 

當使用數組,這樣的參考成員:

appello[0].cdl;//use . for non-pointer 

如果你想要一個數組指針,則初始化是不同的:

pAppello = &appello[0];//initializes your pointer to a copy of struct 
pAppello = malloc(sizeof(APPELLO)*100); //provides 100 instances of pAppello 

現在,你有一個指針數組的結構,並再次將 使用.訪問其成員:

pAppello[0].cdl; 

對於這裏的其他閱讀是一個很好的tutorial on C structures

+0

感謝您的親切的答案,我更新了我的問題結構「Esame」,但從你的代碼我仍然不明白,如果我正確地分配內存段,以共享所有分叉進程之間的結構 – wiredmark 2015-02-09 09:57:13

+0

@wiredmark - 您是否已閱讀並理解此*** [page](http:// linux。 die.net/man/2/shmat)***?這是關鍵:_成功的shmat()調用更新shmid_ds structure_的成員。這個結構已經定義好了,但是你已經創建了自己的結構。 – ryyker 2015-02-09 15:11:22

+0

***關於你的記憶問題*** - 我不確定我是否理解,但我會嘗試一下:通過創建一個指向「APPELLO」的指針數組,你應該能夠使用每個實例來存儲您創建的每個流程。在這個例子中,我們創建了一個100的數組,因此您應該能夠存儲多達100個不同進程的信息。第一個進程爲'pAppello [0] .cdl;',第二個進程爲'pAppello [1] .cdl;',第100個進程爲'pAppello [99] .cdl;'。 – ryyker 2015-02-09 15:15:27