這裏是我的代碼爲什麼子進程和父進程的變量的地址是相同
int main()
{
pid_t pid;
int y = 3;
if ((pid = fork()) <0)
return -1;;
if(pid == 0) /* child */
{
printf(" before: %d %p\n", y, &y);
y *= 10;
printf("after: %d %p\n", y, &y);
}
else /* father */
{
sleep(1);
printf("father: %d %p\n" , y , &y);
}
return 0;
}
程序的輸出就像下面:
before: 3 ffbff440
after: 30 ffbff440
father: 3 ffbff440
我的問題是,爲什麼是地址子和父變量相同但值不同?
另請注意,它必須這樣。如果'y'的地址確實發生了變化,那麼在fork之前的變量或結構中保存的任何指針(地址)將不再正確。這會使得fork變得更加有用,因爲子進程將無法訪問任何數據結構(鏈接列表,樹)或以前動態分配的數據,因爲這些依賴於指針。沒有虛擬內存的系統幾乎不能實現fork,您可以改爲使用vfork(http://pubs.opengroup.org/onlinepubs/7908799/xsh/vfork.html)。 –
從技術上講,「必須這樣」 - 如果你的C運行時支持,你可以使用雙向間接指針(換句話說,指針是一個已知值的偏移量,當分叉時,你將數據移動到其他地方孩子並調整已知的值)。這將是一個性能殺手。我認爲實模式Windows通過鎖定和解鎖內存做了類似的事情。 – paxdiablo
不夠公平,你已經基本上描述了一種廉價而快樂的(或昂貴而悲慘的,取決於你如何看待它)的虛擬內存的軟件實現。在這種情況下,您仍然可以看到提問者觀察到的情況,即分叉前後的地址打印爲相同的值。除非'%p'打印格式化程序也添加到基地址中,否則我想:-) –