關於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執行緒
- 關於面試的思考面試
- 關於Ioc的思考
- 關於重寫equals()和hashCode()的思考
- 關於樹上路徑異或和的思考
- 關於主資料的實踐和思考
- 關於XAML,C#和WPF的更多思考的更多思考C#
- 關於難點的思考
- 關於“開源”的思考
- 關於語言的思考
- 關於ETL工具的思考
- 關於程式碼版本管理的思考和建議
- 關於點贊業務對MySQL和Redis和MongoDB的思考MySqlRedisMongoDB
- 關於DDD和COLA的一些總結和思考
- 關於JS的物件導向的思考和總結JS物件
- c和指標中關於動態分配記憶體malloc和qsort的一個例子指標記憶體
- 關於遞迴和回溯的一次深入思考遞迴
- 關於軟體架構和業務架構的思考架構
- 關於中介軟體的思考
- 關於限流實現的思考
- 關於寫部落格的思考
- 關於Flux,Vuex,Redux的思考VueRedux
- 關於測試流程的思考
- 關於前端的思考與感悟前端
- 關於技術分享的思考
- 關於創業的思考薦創業
- 關於產品的若干思考
- 關於工廠模式的思考模式
- new 和 malloc 的區別
- new和malloc的區別
- 關於Java併發程式設計的總結和思考Java程式設計
- 關於研發效能提升的思考
- 關於運營邊界的思考
- 關於-生物資訊-入門-的思考
- 關於近期幣安事件的思考事件
- 關於同步的一點思考-下
- 最近關於工作的幾點思考
- 關於git flow的一點思考Git