2014-01-22 14 views
2

我很難理解程序的輸出。在使用fork()後,變量inmem的存儲位置顯示相同。 有人可以解釋這個! Thanku使用叉子變量的內存位置

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
int inmem = 9; 
int pid = fork(); 

if(!pid) 
{ 
    printf("child inmem %d %p\n", inmem,&inmem); 
    inmem = 8; 
    printf("child inmem %d %p\n", inmem, &inmem); 

} 

else 
{ 
    printf("parent inmem %d %p\n", inmem, &inmem); 
    inmem = 5; 
    printf("parent inmem %d %p\n", inmem, &inmem); 

} 
return 0 
} 

輸出 -

parent inmem 9 0x7ffff0acdfc8 
parent inmem 5 0x7ffff0acdfc8 
child inmem 9 0x7ffff0acdfc8 
child inmem 8 0x7ffff0acdfc8 
+0

有一些系統調用* *份額幾種不同進程之間的虛擬內存。參見[shm_overview(7)](http://man7.org/linux/man-pages/man7/shm_overview.7.html)和[mmap(2)](http://man7.org/linux/man-頁/男2/mmap.2.html)。您需要同步,請參閱[sem_overview(7)](http://man7.org/linux/man-pages/man7/sem_overview.7.html)。閱讀[高級Linux編程](http://advancedlinuxprogramming.com/) –

+0

爲什麼你不包括'#包括'? – ajay

+2

請不要忽略編譯器警告。用'-Wall'編譯你的代碼,並注意一次,你會看到你需要_cast_你要傳遞給'printf'的指針,到'(void *)' –

回答

1

fork()孩子將有separate address space。該地址空間是指virtual address space。所以父母和孩子將擁有相同的虛擬地址。

OS將在virtual address在獨立的地址空間映射不同physical address

2

fork創建您的過程的精確副本,關於你的代碼並不會忽略。這已經是必須的了,因爲fork之後的代碼執行與以前相同的方式,並且對變量具有相同的訪問權限。但是,一旦進程分叉,它們不再同步,因此分配新內存可能會產生不同的地址。