操作系統中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命
令編譯的。