更新:我無法獲得此工作並採取了不同的方法。正如@nos所指出的那樣,問題在於不在本代碼中,而是在其他地方。 ArrayList在其實現中分配內存,這不是我們分配的共享內存的一部分。感謝您的回覆。fork()後無法從子項檢索mmap共享內存
原問題:
我有一個叉子。我的目標是讓孩子填充數據結構(db - 它是一個ArrayList - 外部實現),然後能夠從父級讀取該數據結構。目前,結果是seg故障,因爲父進程中的數據結構是空的。
下面是代碼:
static ArrayList *db;
pid_t child_pid, pid;
int child_status;
//set up shared memory structure
db = mmap(NULL, 20000, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
child_pid = fork();
if(child_pid == 0) {
//Some operations to initialize and populate db happen here. This works fine.
//printAll(db, 1); //THIS would work. But I want to do this from the parent
exit(0);
} else {
//wait for child process to finish
do {
pid = wait(&child_status);
} while(pid != child_pid);
printAll(db, 1);//THIS IS WHERE IT SEGFAULTS, because db is not initialized - so it was never properly retrieved from mmap
munmap(db, 20000); //fixed this
}
你的操作系統是什麼? – rogerdpack
爲什麼您在munmap'd'ptr'後會希望'printAll(ptr)'是安全的? – pilcrow
操作系統是Ubuntu的。搬遷munmap - 沒有區別 – Ilmar