关于Fork和Malloc的思考

不拘一个遍程序系列程序不能一个脑壳钻到底,有时要学会变通,即所谓的曲线救国。
个人诗歌:都是个人打油诗,可是很值得一读。不要工做还衣食无忧之四难歌   香格里拉美人图
宝宝图片:超可爱的小宝宝 博客
考试培训:主要是关于考研、软考和等级的相关题解。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的地址都是一个地方呢?那是由于这个地址是一个虚拟的地址,每一个进程都拥有本身的虚拟地址空间,不一样进程的相同地址空间其实在物理上是不一样的地址块!

 
注:上面的程序没有加上错误判断,测试程序而已,不用加了。
相关文章
相关标签/搜索