創建子進程時變量的地址與父進程一樣而數值不一樣的問題

操作系統中fork()用來創建子進程,大致過程是子進程複製父進程的內存內容到一塊新的內存。下面來看一下我在學操作系統時碰到的問題:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

main()
{
	int pid;
	int i;
	char *flag[] = {"Parent:","Child:"};
	
	pid = fork();
	if (pid == 0)
		i = 0;
	else 
		i = 1;

	printf("%s:i=%d,&i=%d\n",flag[i],i,&i);
}

下面是運行的結果:

$ ./systest
Child::i=1,&i=2337496
Parent::i=0,&i=2337496

注:&i的地址在每臺計算機可能都不一樣,但是子進程和父進程的&i是一樣的。



根據運行結果可以看出,i值不一樣,然而i的地址是一樣的,這是怎麼回事呢?

查過資料後發現,原來i的地址只是虛擬地址,不是真正的物理地址。地址的

表示方式爲基址+偏移量(虛擬地址),子進程只是把父進程的變量的虛擬地址復

制下來放到與父進程不同的基址中,所以子進程與父進程的i變量所指向的只

是虛擬地址一樣,其物理地址是不一樣的。


注:在windows環境下編譯這個程序出現了一個小問題,不能識別fork()函數,

還好我的電腦裏面裝了cygwin(模擬linux環境的軟件),然後用cygwin的gcc命

令編譯的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章