我想分享我的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]),我就會遇到這個問題。
問題是:如何將此數組結構的內存段共享給連接到服務器的每個客戶端?
請注意,我試圖瞭解大學的練習,我必須用共享內存和分叉解決它。
爲什麼你不在串口上(serialize)(http://en.wikipedia.org/wiki/Serialization)你的數據結構?另請參閱[這個答案](http://stackoverflow.com/a/28373401/841108)到一個相關的問題... – 2015-02-08 19:46:07