社区
C语言
帖子详情
关于fork后父子进程地址空间问题
toycarlove
2008-10-20 01:14:41
linux环境下,主进程malloc了一处地址空间, fork()后在进程中修改这一地址的值,为什么父进程中无法得到修改后的值?我知道fork之后父子进程实际上是分开地址空间了的,但为什么地址指针的值是一样的?指针的值不就是地址吗?地址不是全局的吗?我刚刚接触linux编程,请教,先谢过了。
...全文
478
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
136 Linux 系统编程13 ,进程控制
fork
()创建父
子进程
,循环创建5个
子进程
,进程读时共享写时复制,刚
fork
后父
子进程
相同和不同的地方,父
子进程
真正共享文件描述符 和 mmap映射区
创建一个
子进程
。失败返回-1;成功返回:① 父进程返回
子进程
的ID(非负) ②
子进程
返回 0pid_t类型表示进程ID,但为了表示-1,它是有符号整型。(0不是有效进程ID,init最小,为1)注意返回值,不是
fork
函数能返回两个值,而是
fork
后,
fork
函数变为两个,父子需【各自】返回一个。获取当前进程ID获取当前进程的父进程ID② 是否访问外部硬件资源 二者有任一 → 系统函数;二者均无 → 库函数获取当前进程实际用户ID获取当前进程有效用户ID获取当前进程使用用户组ID。
关于
fork
和父
子进程
的理解
关于
fork
和父
子进程
的理解 (http://blog.163.com/kingore@126/blog/static/8540871920097300284862/) 代码: #include #include main () { pid_t pid; pid=
fork
();
C语言
69,747
社区成员
243,242
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章