免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: socay2
打印 上一主题 下一主题

[C] exec 后,地址空间的疑惑 [复制链接]

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
11 [报告]
发表于 2012-12-17 18:00 |只看该作者
folklore 发表于 2012-12-17 17:31
@socay2

这个错的,


那么,我在子进程中 exec 的时候,肯定是 write 的时候了,因此,也就会为该进程分配新的内存地址。
这个时候系统是否是先试探性的分配一块内存,比如1K,如果,不够,继续分配?

如果上面的说法正确,那么子进程的所用的实际空间就和父进程的没有关系了。
好像是这样的吧,父子进程在内存大小上没有什么依赖关系

期待继续指正!

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
12 [报告]
发表于 2012-12-17 18:02 |只看该作者
zylthinking 发表于 2012-12-17 17:58
说了半天的各位, 可曾真正读过相关代码?
就我所读的过时 linux 源码, fork 确实会拷贝页表项, ...


全部重置,指的是什么,重新分配页表和物理地址吗?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
13 [报告]
发表于 2012-12-17 18:09 |只看该作者
本帖最后由 zylthinking 于 2012-12-17 18:10 编辑
socay2 发表于 2012-12-17 18:02
全部重置,指的是什么,重新分配页表和物理地址吗?


地址空间除了必要的, 每个程序都会有的那部分, 比如系统的 1G, 及其用于传递 stdargs 等所占的几个页面, 其余全部设置成无映射, vma 所有相关记录也全部删除, 总而言之, 与之前一切联系全部中断, 当然, 除了应该继承的那些, 比如 not close on exec 的描述字

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
14 [报告]
发表于 2012-12-17 18:11 |只看该作者
exec 确实楼上所说,看来大家都挺无聊的~~~~~~

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
15 [报告]
发表于 2012-12-17 18:20 |只看该作者
liuiang 发表于 2012-12-17 18:11
exec 确实楼上所说,看来大家都挺无聊的~~~~~~


你的意思是说,exec 就完成了13 楼的重置么?
那么exec结束后,重新映射的地址空间大小和父进程映射的地址空间大小就不一样了。视exec调用的程序大小来决定。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
16 [报告]
发表于 2012-12-17 18:26 |只看该作者
是的,只要exec,他就放弃了继承遗产的权利,完全白手起家。

至于描述的缺陷----空间是不会变的,只是内存消耗变了。空间是体系决定的,32bit就是4G空间,但是这4G空间并非与真实内存一一对应,

用到的空间才对应具体的内存(好吧,这里忽略交换),没用过的空间,只有空的索引而已。

论坛徽章:
0
17 [报告]
发表于 2012-12-17 19:13 |只看该作者
此事只与fork有关...
fork之后看父进程执行什么样的操作了,如果没有任何操作,那它估计已经返回了,那100M内存已经被系统回收了.

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-21 06:20:00
18 [报告]
发表于 2012-12-17 23:41 |只看该作者
本帖最后由 moxies 于 2012-12-17 23:51 编辑

http://en.wikipedia.org/wiki/Fork-exec 看这个文章,同时还说了点别的,摘录如下:

When the child process calls exec(), all data in the original program is lost, and replaced with a running copy of the new program. This is known as overlaying. Although all data are replaced, the file descriptors that were open in the parent are closed only if the program has explicitly marked them close-on-exec. This allows for the common practice of the parent creating a pipe prior to calling fork() and using it to communicate with the executed program.


http://www.chinaunix.net/old_jh/23/62446.html 咱cu上也有过分析。没看过的同学。都来看看。{:3_189:}

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
19 [报告]
发表于 2012-12-18 00:36 |只看该作者
moxies 发表于 2012-12-17 23:41
http://en.wikipedia.org/wiki/Fork-exec 看这个文章,同时还说了点别的,摘录如下:

When the child p ...

在CU的讨论我看到这样一句
但子进程也有与父进程不同的属性,这点很重要:
. 进程号, 子进程号不同与任何一个活动的进程组号. 
. 父进程号. 
. 子进程继承父进程的文件描述符或流时,具有自己的一个拷贝并且与父进程和其它子进程共享该资源. 
. 子进程的用户时间和系统时间被初始化为0. 
. 子进程的超时时钟设置为0. 
. 子进程的信号处理函数指针组置为空. 
. 子进程不继承父进程的记录锁. 

但是我用如下代码测试:
  1. void fun(int signo)
  2. {
  3.         printf("%d\n", getpid());
  4. }
  5. int main(int argc, char **argv)
  6. {
  7.         signal(SIGINT, fun);
  8.         if(fork()) {
  9.                 printf("parent: %d\n", getpid());
  10.                 while(1);
  11.         }
  12.         else {
  13.                 printf("child: %d\n", getpid());
  14.                 while(1);
  15.         }
  16. }
复制代码
子进程的信号处理函数并没有被置为空,还是继承了父进程的处理方式。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-21 06:20:00
20 [报告]
发表于 2012-12-18 08:55 |只看该作者
@socay2擦,真刻苦。

你看的那段,好像有个前提就是fork 后 exec 。。。 对也不对?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP