2013-11-22 43 views
0

更新:我無法獲得此工作並採取了不同的方法。正如@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 



} 
+0

你的操作系統是什麼? – rogerdpack

+1

爲什麼您在munmap'd'ptr'後會希望'printAll(ptr)'是安全的? – pilcrow

+0

操作系統是Ubuntu的。搬遷munmap - 沒有區別 – Ilmar

回答

1
munmap(db, 20000); 

printAll(db, 1);//T//THIS IS WHERE IT SEGFAULTS, 

這是不足爲奇,你未映射在它上面的線的存儲器。

+0

固定 - 仍然是同樣的問題。 – Ilmar

+0

@llmar然後你在其他地方有一個錯誤。您擁有的代碼片段將正確共享父代與子代之間的內存,您可以使用一個小樣本(如http://ideone.com/e0BXFq)對此進行驗證,並且您可以調試您擁有的代碼並手動檢查記憶。 – nos

+0

你說得對,那工作得很好。我不知道錯誤在哪裏 - 也許我的數據結構正在使用另一個存儲在不同內存位置的結構。我會研究併發布更新。謝謝。 – Ilmar