关于fork()进程的一个简单问题!!!!!!!!!!!!!!!!

Dstnoe 2010-11-27 01:33:40



#include <stdlib.h>
#include <stdio.h>
int main()
{
char buf[3]="AB";
char *str=buf;
if(fork()>0)
wait();
else
*str='M';
printf("%x:%s\n",(unsigned int)str,str);
return 0;
}




linux2.6环境下编译运行,结果是:
bfc807bd:MB
bfc807bd:AB
我的疑问是:

子进程和父进程输出的str 地址都是bfc807bd,子进程修改了bfc807bd内存单元的值,为什么父进程输出的还是AB??
在父进程创建子进程后,子进程获得父进程的一个副本,包括数据段,栈空间,指令段等,既然str指向的都是同一个地址,为什么数据不同? 难道与进程的虚拟地址空间有关?
...全文
105 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑呼乎 2010-11-30
  • 打赏
  • 举报
回复
当你写的时候就会重新非配一个空间不和父进程共享了 如果只是读读不会:写时复制
黑呼乎 2010-11-30
  • 打赏
  • 举报
回复
当你试图写的时候就会分配一个空间了 不和父进程共享了 读的时候不会 写时复制
laoshizhuce 2010-11-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feiyinzilgd 的回复:]

虚拟地址。

他们各自有各自的地址空间。

COW,写时复制。

然后各自有各自的地址空间。
[/Quote]

差不多是这样
ajige 2010-11-29
  • 打赏
  • 举报
回复
不同进程有各自的虚拟内存空间。。。
学习了
jihen 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yunshishenlou 的回复:]
推荐 深入理解计算机系统 这本书,你看了之后就明白了。
[/Quote]
不需要深入理解都该明白,不同进程有各自的虚拟内存空间,两个地址都是虚拟的而已。应该系统地学习下。
yunshishenlou 2010-11-29
  • 打赏
  • 举报
回复
推荐 深入理解计算机系统 这本书,你看了之后就明白了。
jihen 2010-11-28
  • 打赏
  • 举报
回复
ni ba thread he process gao hun luan le.
Dstnoe 2010-11-28
  • 打赏
  • 举报
回复
明天在书上查查,是怎么转换的,操作系统教材上只说了虚拟地址概念,在父进程和子进程中具体实现都没提,还是得靠自己动手发现问题。。。。
cavalier_man 2010-11-28
  • 打赏
  • 举报
回复
虚拟地址撒,子进程和父进程都有独立的地址空间
ljj349000955 2010-11-28
  • 打赏
  • 举报
回复
路过。。。。。。
Dstnoe 2010-11-28
  • 打赏
  • 举报
回复
嘿嘿,还是在C/C++ 板块里看看吧,我发了两个一样的贴!
http://topic.csdn.net/u/20101127/12/4e5d602b-a4cd-4be9-8f58-870190161342.html?seed=1495255500&r=70204460#r_70204460
lgch123456 2010-11-27
  • 打赏
  • 举报
回复
刚把题看错了,我觉得楼上哥们说的貌似是这样的
lgch123456 2010-11-27
  • 打赏
  • 举报
回复
我觉得是这样的,子进程执行时间可能在父进程的前面 也可能在后面,楼主可以尝试多执行几次。可能会有不同的结果、、、
nossiac 2010-11-27
  • 打赏
  • 举报
回复
1.基于效率的考虑,子进程创建时仅复制父进程的页表,因此子进程可以共享父进程的内存,只有子进程要更改内存数据时,操作系统才会复制对应的内存页。
2.程序里看到的地址都是虚拟地址,即使两个进程往同一个地址写,实际会映射到不同的地方.
yangzhifu 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feiyinzilgd 的回复:]

虚拟地址。

他们各自有各自的地址空间。

COW,写时复制。

然后各自有各自的地址空间。
[/Quote]

cow全称copy on write:
linux下面有一个规定fork后的共享数据不会马上拷贝给子进程,而是当子进程在写数据区的时候会才开始拷贝父进程的数据,上面运行的结果也说明了这一点,父进程没有变化,子进程出现了变化。
谭海燕 2010-11-27
  • 打赏
  • 举报
回复
虚拟地址。

他们各自有各自的地址空间。

COW,写时复制。

然后各自有各自的地址空间。
cceczjxy 2010-11-27
  • 打赏
  • 举报
回复
str 地址都是bfc807bd ,它是两套系统内的地址,各自算各自的。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧