关于fork后父子进程地址空间问题

toycarlove 2008-10-20 01:14:41
linux环境下,主进程malloc了一处地址空间, fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值?我知道fork之后父子进程实际上是分开地址空间了的,但为什么地址指针的值是一样的?指针的值不就是地址吗?地址不是全局的吗?我刚刚接触linux编程,请教,先谢过了。
...全文
478 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
toycarlove 2008-11-20
  • 打赏
  • 举报
回复
明明白白的了,上学学的都还给老师了
pingzi_1119 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hhyttppd 的回复:]
fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值
每个进程都有自己的进程空间,虽然地址一样,但实现映射的物理内存绝不会相同。
[/Quote]
up
LiTuX 2008-10-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiangqian 的回复:]
儿子屁股长痣,老爹也跟着长么?
[/Quote]
哈哈,经典!

xmczr 2008-10-20
  • 打赏
  • 举报
回复
1,fork()创建的子进程和父进程数据空间是不可能相同的。
2,进程中用的地址空间是虚拟地址空间,每个进程能用多大由内核决定。
xiangqian 2008-10-20
  • 打赏
  • 举报
回复
儿子屁股长痣,老爹也跟着长么?
Arthur_ 2008-10-20
  • 打赏
  • 举报
回复
,主进程malloc了一处地址空间, fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值?我知道fork之后父子进程实际上是分开地址空间了的,但为什么地址指针的值是一样的?指针的值不就是地址吗?地址不是全局的吗?我刚刚接触linux编程,请教,先谢过了。
====================

它们的页表项不同。
帅得不敢出门 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xhs_lh04 的回复:]
fork应该是复制了一份父进程的空间,主进程malloc了一处地址空间,指针的值在子进程当然一样了,但是它们在不同的进程空间,指针虽然一样,但指针值是虚地址经过映射后的物理地址当然是不一样的,所以你改了值,主进程的这块空间值当然是没变,因为改的不是它的空间.
[/Quote]
是的偏移相同,但是基地址不一样,寻址的空间也不一样了
  • 打赏
  • 举报
回复
有答案了

mifeixq 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mifeixq 的回复:]
fork后你操作的其实是父进程的cpoy~~对服进程是没有影响的……
[/Quote]
晕,严重错别字

fork后你操作的其实是父进程的copy~~对父进程是没有影响的……
mifeixq 2008-10-20
  • 打赏
  • 举报
回复
fork后你操作的其实是父进程的cpoy~~对服进程是没有影响的……
Wolf0403 2008-10-20
  • 打赏
  • 举报
回复
int *p = (int*) malloc(sizeof(int));
// p = 0xDEAD BEEF

pid = fork();
if (pid == 0) {
// child process
p 指向的是新进程中的 0xDEAD BEEF 内存位置
}
else {
// parent process
*p = 1; // 修改的是父进程内存中 0xDEAD BEEF 位置
}

虽然两个指针指向的相对位置相同,但是两个地址是分散在两个进程地址空间中的。
LiTuX 2008-10-20
  • 打赏
  • 举报
回复
貌似好多地方的fork实现为vfork,就是所谓“写时复制”的fork。

于是子线程在改东东时内核给它重新创建了一块内存区域,就和父进程的不是同一个东东了。

(原始的fork直接就是不一样的内存空间。)

redleaves 2008-10-20
  • 打赏
  • 举报
回复
顶 copy on write
Fighting Horse 2008-10-20
  • 打赏
  • 举报
回复
fork后虚拟地址、物理地址都一样,但是copy_on_write了,只要你一修改,就赋值一份出来给你修改,这里的赋值是重新申请一块物理内存,但是虚拟地址不变,只是映射改变了
xhs_lh04 2008-10-20
  • 打赏
  • 举报
回复
fork应该是复制了一份父进程的空间,主进程malloc了一处地址空间,指针的值在子进程当然一样了,但是它们在不同的进程空间,指针虽然一样,但指针值是虚地址经过映射后的物理地址当然是不一样的,所以你改了值,主进程的这块空间值当然是没变,因为改的不是它的空间.

hhyttppd 2008-10-20
  • 打赏
  • 举报
回复
fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值
每个进程都有自己的进程空间,虽然地址一样,但实现映射的物理内存绝不会相同。
  • 打赏
  • 举报
回复
没明白,什么意思……

69,747

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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