社区
C语言
帖子详情
关于fork后父子进程地址空间问题
toycarlove
2008-10-20 01:14:41
linux环境下,主进程malloc了一处地址空间, fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值?我知道fork之后父子进程实际上是分开地址空间了的,但为什么地址指针的值是一样的?指针的值不就是地址吗?地址不是全局的吗?我刚刚接触linux编程,请教,先谢过了。
...全文
561
17
打赏
收藏
关于fork后父子进程地址空间问题
linux环境下,主进程malloc了一处地址空间, fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值?我知道fork之后父子进程实际上是分开地址空间了的,但为什么地址指针的值是一样的?指针的值不就是地址吗?地址不是全局的吗?我刚刚接触linux编程,请教,先谢过了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
是的偏移相同,但是基地址不一样,寻址的空间也不一样了
青葱岁月不可追
2008-10-20
打赏
举报
回复
有答案了
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()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值
每个进程都有自己的进程空间,虽然地址一样,但实现映射的物理内存绝不会相同。
青葱岁月不可追
2008-10-20
打赏
举报
回复
没明白,什么意思……
关于c的
子进程
fork
()
本文围绕C语言中
fork
系统调用展开,介绍其语法、行为、典型用法及常见
问题
。它用于在Unix-like系统创建新进程,父
子进程
从调用处并行执行,通过返回值区分。还阐述了
fork
后
地址空间
情况,采用写时复制技术减少内存开销。
fork
进程复制
本文通过一个简单的C语言示例程序,演示了如何使用
fork
创建
子进程
,并探讨了父
子进程
间内存隔离的
问题
。具体分析了在
fork
后,尽管父
子进程
共享相同的指针变量,但由于
地址空间
的独立性导致它们实际上指向不同的内存位置。
进程
地址空间
本文围绕Linux系统展开,介绍了页表和进程
地址空间
。回顾了
fork
接口,通过现象引出地址映射与页表概念,解释父
子进程
数据地址现象。阐述进程
地址空间
定义、划分方式,说明其与页表作用,还探讨缺页中断、写时拷贝及内存空间申请等
问题
,提升系统资源利用效率。
2.3-2.5 进程创建+虚拟
地址空间
+GDB多进程调试
文章详细阐述了Linux系统中
fork
函数用于创建
子进程
的机制,包括
fork
返回值如何区分父进程和
子进程
,以及父
子进程
的虚拟
地址空间
情况。通过写时拷贝技术,父
子进程
共享代码和读时共享资源,但在写入时会复制
地址空间
。同时,文章提到了GDB多进程调试的相关知识,如如何挂起和切换进程,并指出在调试过程中应注意的版本
问题
。
14.进程-
fork
函数与文件共享
本文探讨了在Linux系统中,进程通过
fork
调用创建
子进程
时,文件描述符是否被共享的
问题
。揭示了尽管进程
地址空间
看似隔离,但由于内核空间的共享特性,导致文件描述符实际上被父
子进程
所共享。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章