malloc()后进行fork()系统调用,父子进程空间关系如何

 

有人问我,在父进程中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的地址都是一个地方呢?那是因为这个地址是一个虚拟的地址,每个进程都拥有自己的虚拟地址空间,不同进程的相同地址空间其实在物理上是不同的地址块!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值