文章试读
不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国。一、二、三、四
职场规划:一些杂七杂八的职场感悟吧。不值钱的软件人才 精力充沛与事业成功 让系分来得更猛烈些吧 不值钱的系统分析师 经济危机下大学生如何就业
我的诗歌:都是我的打油诗,但是很值得一读。不要工作还衣食无忧之四难歌 香格里拉美人图
宝宝图片:超可爱的小宝宝 写博客
考试培训:主要是关于考研、软考和等级的相关题解。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编程技术