社区
C语言
帖子详情
关于fork后父子进程地址空间问题
toycarlove
2008-10-20 01:14:41
linux环境下,主进程malloc了一处地址空间, fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值?我知道fork之后父子进程实际上是分开地址空间了的,但为什么地址指针的值是一样的?指针的值不就是地址吗?地址不是全局的吗?我刚刚接触linux编程,请教,先谢过了。
...全文
551
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
打赏
举报
回复
没明白,什么意思……
fork
后父
子进程
共享资源
fork
后父
子进程
共享资源Unix环境高级编程中8.3节中说,“
子进程
是父进程的副本。例如,
子进程
获得父进程数据空间、堆和栈的副本。注意,这是
子进程
所拥有的副本。父进程和
子进程
并不共享这些存储空间部分。父进程和
子进程
共享正文段。”书中还预留了例子说明
子进程
对变量所做的改变并不影响父进程中该变量的值。/** *
fork
.c * 探讨父
子进程
共享变量
问题
**/#include
Linux编程:
fork
后父
子进程
的内存
linux编程中,通过
fork
函数会创建
子进程
,创建后根据写时复制策略,父
子进程
是共享父进程的堆与栈,当父
子进程
中的一方对内存进行了写操作后,父
子进程
的内存会分离,各自拥有自己独立的内存: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #define STR_SIZE 30 void doInChild(char *str) { pri
fork
+父
子进程
在理解+进程控制
fork
+父
子进程
在理解 进程控制 1.进程终止 2.进程等待 3.获取进程状态Status
关于
fork
和父
子进程
的理解
关于
fork
和父
子进程
的理解 (http://blog.163.com/kingore@126/blog/static/8540871920097300284862/) 代码: #include #include main () { pid_t pid; pid=
fork
();
fork
之
后父
子进程
的内存关系
1.fock()调用的基本语义#include
pid_t
fork
(void); //父进程返回
子进程
的pid,
子进程
返回0,错误返回-1
fork
()创建了一个心的进程(child)信进程几乎是调用进程(父进程的翻版),理解
fork
()的关键是,在完成对其调用之后,会产生2个进程,且每个进程都会从
fork
()的返回处开始执行.这俩个进程将执行相同的程序段,但是拥有各自不同的堆段
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章