为了账号安全,请及时绑定邮箱和手机立即绑定

关于Fork和Malloc的思考

标签:
Linux

文章试读

不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。一、二、三、四

职场规划:一些杂七杂八的职场感悟吧。不值钱的软件人才 精力充沛与事业成功   让系分来得更猛烈些吧    不值钱的系统分析师   经济危机下大学生如何就业

我的诗歌:都是我的打油诗,但是很值得一读。不要工作还衣食无忧之四难歌   香格里拉美人图

宝宝图片:超可爱的小宝宝 写博客

考试培训:主要是关于考研、软考和等级的相关题解。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的地址都是一个地方呢?那是因为这个地址是一个虚拟的地址,每个进程都拥有自己的虚拟地址空间,不同进程的相同地址空间其实在物理上是不同的地址块!

 

注:上面的程序没有加上错误判断,测试程序而已,不用加了。

 

 

©著作权归作者所有:来自51CTO博客作者zhuyunxiang的原创作品,如需转载,请注明出处,否则将追究法律责任

Unix进程fork编程技术


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消