關於Fork和Malloc的思考

farsun發表於2021-09-09

文章試讀

不拘一個遍程式系列:程式設計序不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。一、二、三、四

職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟體人才 精力充沛與事業成功   讓系分來得更猛烈些吧    不值錢的系統分析師   經濟危機下大學生如何就業

我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌   香格里拉美人圖

寶寶圖片:超可愛的小寶寶 寫部落格

考試培訓:主要是關於考研、軟考和等級的相關題解。2009考研試題分析   2008年12月程式設計師試題分析    2009年軟考備考全攻略    2008年5月程式設計師試題解析

 

 

 

 

有人問我,在父程式中Malloc的記憶體空間,如果fork()後,到了子程式中,會不會在copy一份出來?還是共用一個空間?看程式:

 void main() 

                char *p; 

                p = malloc(10); 

                strcpy(p, "ccc"); 

                printf("p=%p %sn", p, p); 

                if (fork() == 0) 

                { 

                                strcpy(p, "ccc3333"); 

                                printf("child p=%p %sn", p,p); 

                                sleep(10); 

                                printf("child p=%p %sn", p,p); 

                } 

                else 

                { 

                                sleep(3); 

                                strcpy(p, "ccc444"); 

                                printf("father p=%p %sn", 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的地址都是一個地方呢?那是因為這個地址是一個虛擬的地址,每個程式都擁有自己的虛擬地址空間,不同程式的相同地址空間其實在物理上是不同的地址塊!

 

注:上面的程式沒有加上錯誤判斷,測試程式而已,不用加了。

 

 

©著作權歸作者所有:來自51CTO部落格作者zhuyunxiang的原創作品,如需轉載,請註明出處,否則將追究法律責任

Unix程式fork程式設計技術


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2822172/,如需轉載,請註明出處,否則將追究法律責任。

相關文章