malloc 之后的父子进程之间的空间关系如何
来源:互联网 发布:公主联盟静态数据 编辑:程序博客网 时间:2024/03/29 14:29
有人问我,在父进程中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);
}
{
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
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的地址都是一个地方呢?那是因为这个地址是一个虚拟的地址,每个进程都拥有自己的虚拟地址空间,不同进程的相同地址空间其实在物理上是不同的地址块!
0 0
- malloc 之后的父子进程之间的空间关系如何
- 父子进程之间的关系
- fork之后父子进程的内存关系
- fork 父子进程变量之间的关系
- malloc()后进行fork()系统调用,父子进程空间关系如何
- for的父子进程关系
- 父子进程之间的区别
- 两个没有父子关系的html之间如何传递数据
- 创建进程 fork()函数的基本使用 父子进程之间的关系
- qt空间句柄的父子关系
- 父子元素之间的关系(ItemsPresenter)
- fork()父子进程变量之间的关系与信号的响应
- 进程创建/退出父子关系的调整
- 看看进程、线程的父子关系
- 父子进程之间数据的同步
- loff_t解析和单个进程和父子进程之间是如何处理文件描述符的
- 非父子关系的情况下如何实现div层之间的覆盖?
- malloc,calloc,realloc,memset之间的关系
- poj3020
- python中eval, exec, execfile,和compile [转载]
- C++ linked list 中添加某一个特定位置节点
- OCP 1Z0 053 111
- C++模板函数声明定义分离编译错误详解
- malloc 之后的父子进程之间的空间关系如何
- HDU 1016 Prime Ring Problem(DFS回溯)
- POJ 1753 Flip Game
- Keil串口仿真调试
- 单例模式——懒汉模式和饿汉模式
- Tomcat 启动失败 IllegalArgumentException: Malformed
- eclipse Package的设置
- Java NIO系列教程(一) Java NIO 概述
- apache与php配置