關於Fork和Malloc的思考

不拘一個遍程序系列程序不能一個腦殼鑽到底,有時要學會變通,即所謂的曲線救國。
個人詩歌:都是個人打油詩,可是很值得一讀。不要工做還衣食無憂之四難歌   香格里拉美人圖
寶寶圖片:超可愛的小寶寶 博客
考試培訓:主要是關於考研、軟考和等級的相關題解。2009考研試題分析   2008年12月程序員試題分析    2009年軟考備考全攻略    2008年5月程序員試題解析
 
 
 
 
有人問我,在父進程中Malloc的內存空間,若是fork()後,到了子進程中,會不會在copy一份出來?仍是共用一個空間?看程序:
void main()
{
                 char *p;
                p = malloc(10);
                strcpy(p, "ccc");
                printf( "p=%p %s\n", p, p);
                 if (fork() == 0)
                {
                                strcpy(p, "ccc3333");
                                printf( "child p=%p %s\n", p,p);
                                sleep(10);
                                printf( "child p=%p %s\n", p,p);
                }
                 else
                {
                                sleep(3);
                                strcpy(p, "ccc444");
                                printf( "father p=%p %s\n", p,p);
                }
                free(p);
}

執行結果:
[zyx@ymserver src]$ ../bin/t1    
p=0x8ea0008 ccc
child p=0x8ea0008 ccc3333
father p=0x8ea0008 ccc444
[zyx@ymserver src]$ child p=0x8ea0008 ccc3333

 
最開始,內存塊的值是ccc,地址爲0x8ea0008
後來,先執行子進程的                strcpy(p, "ccc3333"); 發現,內存值變成了ccc3333
再父進程                strcpy(p, "ccc444"); 發現,內存值變成了ccc444
那麼是否是子進程的值被改變了呢?不是,看最後,子進程讀取的內存值仍是ccc3333,就能夠知道,父子進程各有一片空間。
那麼爲何p的地址都是一個地方呢?那是由於這個地址是一個虛擬的地址,每一個進程都擁有本身的虛擬地址空間,不一樣進程的相同地址空間其實在物理上是不一樣的地址塊!

 
注:上面的程序沒有加上錯誤判斷,測試程序而已,不用加了。
相關文章
相關標籤/搜索