我正在處理C中的數據庫服務器,該服務器將處理來自多個客戶端的請求。爲了做到這一點,我使用fork()來處理單個客戶端的連接。使用fork共享堆內存()
服務器將數據存儲在堆中,該堆包含指向動態分配記錄散列表的根指針。記錄是指向各種數據類型的結構。我希望進程能夠共享這些數據,以便當客戶端對堆進行更改時,其他客戶端可以看到更改。
我已經瞭解到fork()使用COW (Copy On Write),我的理解是當孩子嘗試修改內存中的數據時,它會複製父進程的堆(和棧)內存。
我發現我可以使用shm庫來共享內存。
- 是否足以共享數據庫的根指針,還是必須使所有分配的內存共享?
- 如果孩子分配內存,父母/其他孩子能夠訪問它嗎?
- 如果一個孩子分配內存,後來被殺死,分配的內存是否仍然留在堆上?
因此,例如下面的代碼是共享堆內存的有效方法(在shared_string中)?如果一個孩子使用類似的代碼(即從//開始),其他孩子能夠在孩子跑步和跑完後讀/寫嗎?
key_t key;
int shmid;
key = ftok("/tmp",'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
//start
char * string;
string = malloc(sizeof(char) * 10);
strcpy(string, "a string");
char * shared_string;
shared_string = shmat(shmid, string, 0);
strcpy(shared_string, string);
如果您想在同一程序的各個部分之間共享內存,使用*線程*更爲常見。但是,您必須非常小心如何使用鎖等同步訪問共享數據結構。 – alberge 2012-04-01 03:13:56
好吧,您需要爲所有想要共享的內容使用共享內存。 – 2012-04-01 03:19:45
只有shm可以共享,如果你分配新的內存,它也必須在shm上,沒有捷徑。 – pizza 2012-04-01 03:25:47