關於Fork和Malloc的思考
文章試讀
不拘一個遍程式系列:程式設計序不能一個腦袋鑽到底,有時要學會變通,即所謂的曲線救國。一、二、三、四
職場規劃:一些雜七雜八的職場感悟吧。不值錢的軟體人才 精力充沛與事業成功 讓系分來得更猛烈些吧 不值錢的系統分析師 經濟危機下大學生如何就業
我的詩歌:都是我的打油詩,但是很值得一讀。不要工作還衣食無憂之四難歌 香格里拉美人圖
寶寶圖片:超可愛的小寶寶 寫部落格
考試培訓:主要是關於考研、軟考和等級的相關題解。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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於linux多執行緒fork的理解和學習Linux執行緒
- 關於重寫equals()和hashCode()的思考
- 關於主資料的實踐和思考
- 關於樹上路徑異或和的思考
- 關於程式碼版本管理的思考和建議
- 關於難點的思考
- 關於面試的思考面試
- 關於DDD和COLA的一些總結和思考
- 關於JS的物件導向的思考和總結JS物件
- 關於2021年的一些收穫和思考
- 關於遞迴和回溯的一次深入思考遞迴
- 關於點贊業務對MySQL和Redis和MongoDB的思考MySqlRedisMongoDB
- 關於限流實現的思考
- 關於中介軟體的思考
- 關於Flux,Vuex,Redux的思考VueRedux
- 關於工廠模式的思考模式
- 關於寫部落格的思考
- 關於軟體架構和業務架構的思考架構
- 關於近期幣安事件的思考事件
- 關於 Method Swizzling 的一點思考
- 關於同步的一點思考-下
- 關於 PHP 框架的簡單思考PHP框架
- 關於研發效能提升的思考
- 關於運營邊界的思考
- 關於CodeReview的一些思考View
- 關於git flow的一點思考Git
- 關於知識付費的思考
- 最近關於工作的幾點思考
- 關於malloc原始碼中的bin_at巨集定義的個人見解原始碼
- iOS關於換膚和夜間模式的一些思考iOS模式
- 關於壓力測試中 TPS 和併發數的思考
- new 和 malloc 的區別 及使用
- 關於python的三種子程序啟動方式:fork, spawn, forkserverPythonServer
- 關於社交圈子的一點思考
- 關於PHP協程與阻塞的思考PHP
- 關於資料視覺化的思考視覺化
- 關於-生物資訊-入門-的思考
- 關於 Masonry 的一些思考(下)