父进程创建子进程的资源共享问题

drq6772 2009-06-20 09:02:07
看到操作系统书上说,父进程执行fork()系统调用之后创建子进程,父进程与子进程各自拥有独立的地址空间。

以上的说法是否说明父进程与子进程除了共享代码段之外没有任何关联?

昨天去一家公司笔试,笔试题如下(不定项选择):

当父进程调用fork()创建子进程之后,下列哪些变量在子进程中修改之后,父进程里也会相应地作出改动?
A.全局变量
B.局部变量
C.静态变量
D.文件指针


请大家详细分析一下,主要就是父进程和子进程的资源共享问题,我搞得很模糊。
...全文
5828 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序的陈 2010-11-06
  • 打赏
  • 举报
回复
小梁我再次发现你了~
xiaocainiaoyuan 2010-05-07
  • 打赏
  • 举报
回复
都是高人~
lqflyc 2009-12-04
  • 打赏
  • 举报
回复
说C的都是做windows的
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hikaliv 的回复:]
引用 12 楼 drq6772 的回复:
我理解你的意思,对文件指针进行解引用操作时,指针所指的对象发生改变,因此会影响到父进程。是这个意思吗?



进程的指针只是一个“虚地址”,操作内存的时候,是需要操作系统“映射”到物理地址上的,子进程对指针操作后,虽然无法影响父进程的“指针变量”,但是,父进程的“指针变量”没变,“父进程的映射关系”改变了,会映射到同一块“物理地址”上。所以所谓的影响,指的是这个影响,…
[/Quote]

人家在谈文件指针,你讲虚拟地址,想表达什么?
bao_bao_bao_bao 2009-06-20
  • 打赏
  • 举报
回复
学习
drq6772 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hikaliv 的回复:]
进程的指针只是一个“虚地址”,操作内存的时候,是需要操作系统“映射”到物理地址上的,子进程对指针操作后,虽然无法影响父进程的“指针变量”,但是,父进程的“指针变量”没变,“父进程的映射关系”改变了,会映射到同一块“物理地址”上。所以所谓的影响,指的是这个影响,但是…
[/Quote]

不是很理解。你这里的“进程的指针”是指向某个文件的指针吗?“虽然无法影响父进程的“指针变量”,但是,父进程的“指针变量没变””,这里是用转折关系的语义吗?越来越糊涂了
yungtain 2009-06-20
  • 打赏
  • 举报
回复
顺便学习高人教导!
drq6772 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lingyin55 的回复:]

fork()子进程和父进程共享的资源

[/Quote]

这里的“共享”是指子进程拥有与父进程资源的副本还是父子进程共用资源,如果是后者的话,那子进程对变量的任何修改,在父进程中也会有相应的改动的吧?
光宇广贞 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 drq6772 的回复:]
我理解你的意思,对文件指针进行解引用操作时,指针所指的对象发生改变,因此会影响到父进程。是这个意思吗?
[/Quote]

进程的指针只是一个“虚地址”,操作内存的时候,是需要操作系统“映射”到物理地址上的,子进程对指针操作后,虽然无法影响父进程的“指针变量”,但是,父进程的“指针变量”没变,“父进程的映射关系”改变了,会映射到同一块“物理地址”上。所以所谓的影响,指的是这个影响,但是做为“变量本身”,指针的值是不会变的。改变的只是映射关系。
drq6772 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hikaliv 的回复:]
fork 是 linux 的。多进程的概念也是LINUX的。WIN下讲究的是多线程。

fork之后,从 fork 处开始父子进程并行执行,公有变量的值也在 fork 处被复制(当时的值),则父子进程分别使用各自的复本(而非共享)。

见我这篇博文:
http://blog.csdn.net/hikaliv/archive/2009/06/17/4276758.aspx

上题答案是 D。首先你要明白“变量”和“进程”,同不的进程使用不同的地址空间,子进程被创建之后,父进程的全局变量、静态变量和…
[/Quote]

我理解你的意思,对文件指针进行解引用操作时,指针所指的对象发生改变,因此会影响到父进程。是这个意思吗?
  • 打赏
  • 举报
回复
对多进程和多线程有兴趣,可以看看我这篇:


http://blog.csdn.net/hairetz/archive/2009/06/19/4281931.aspx
光宇广贞 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hikaliv 的回复:]
fork 是 linux 的。多进程的概念也是LINUX的。WIN下讲究的是多线程。

fork之后,从 fork 处开始父子进程并行执行,公有变量的值也在 fork 处被复制(当时的值),则父子进程分别使用各自的复本(而非共享)。

见我这篇博文:
http://blog.csdn.net/hikaliv/archive/2009/06/17/4276758.aspx

上题答案是 D。首先你要明白“变量”和“进程”,同不的进程使用不同的地址空间,子进程被创建之后,父进程的全局变量、静…
[/Quote]

进程的指针只是一个“虚地址”,操作内存的时候,是需要操作系统“映射”到物理地址上的,子进程对指针操作后,虽然无法影响父进程的“指针变量”,但是,父进程的“指针变量”没变,“父进程的映射关系”改变了,会映射到同一块“物理地址”上。所以所谓的影响,指的是这个影响,但是做为“变量本身”,指针的值是不会变的。

这个概念,楼主也要明确。
lingyin55 2009-06-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 drq6772 的回复:]
别光说答案,我想知道的是原理。
只给出答案的不能给分,抱歉!
[/Quote]

http://kenchou.spaces.live.com/blog/cns!f0d48c03fcd214ce!374.entry
fork()子进程和父进程共享的资源
子进程和父进程共享很多资源,除了打开文件之外,很多父进程的其他性质也由子进程继承:

实际用户ID、实际组ID、有效用户ID、有效组ID。
添加组ID。
进程组ID。
对话期ID。
控制终端。
设置-用户-ID标志和设置-组-ID标志。
当前工作目录。
根目录。
文件方式创建屏蔽字。
信号屏蔽和排列。
对任一打开文件描述符的在执行时关闭标志。
环境。
连接的共享存储段。
资源限制。
父、子进程之间的区别是:

fork的返回值。
进程ID。
不同的父进程ID。
子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime设置为0。
父进程设置的锁,子进程不继承。
子进程的未决告警被清除。
子进程的未决信号集设置为空集。
  • 打赏
  • 举报
回复
D.文件指针吧。


复制出来的子进程的task_struct结构与系统的堆栈空间是与父进程独立的,但其他资源却是与父进程共享的,比如文件指针,socket描述符等。

http://blog.chinaunix.net/u/12325/showart_91517.html

http://topic.csdn.net/u/20080513/22/030214e3-1320-4981-a896-fe55e776b699.html

linux系统分析上是这样说的:在克隆进程时,Linux 允许两个进程共享相同的资源。可共享的资源包括文件、信号处理程序和虚拟内存等(通过继承)。当某个资源被共享时,该资源的引用计数值会增加 1,从而只有两个进程均终止时,内核才会释放这些资源。


图标关系间此文:
http://www.kerneltravel.net/kernel-book/%E7%AC%AC%E5%85%AD%E7%AB%A0%20Linux%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/6.8.1.htm


克隆的时候,只会复制堆栈,以及task_struct吧,file_struct应该不会复制,而文件指针在file_struct->fd[i]->f_pos里啊。
光宇广贞 2009-06-20
  • 打赏
  • 举报
回复
fork 是 linux 的。多进程的概念也是LINUX的。WIN下讲究的是多线程。

fork之后,从 fork 处开始父子进程并行执行,公有变量的值也在 fork 处被复制(当时的值),则父子进程分别使用各自的复本(而非共享)。

见我这篇博文:
http://blog.csdn.net/hikaliv/archive/2009/06/17/4276758.aspx

上题答案是 D。首先你要明白“变量”和“进程”,同不的进程使用不同的地址空间,子进程被创建之后,父进程的全局变量、静态变量和 fork 处的静态变量会复制到子进程的地址空间中,自此以后,二者开始“各行其是”,互不干扰,所以,所有的“变量”都将各自独立,ABC全都错误。

而对于指针来说,虽然复制过,指针做为“变量”已经互不干扰,但是你在进行指针操作的时候,会通过物理地址的映射反映到父进程当中。

父子进程没有资源共享的事儿,父子进程的一切变量都互不干扰,楼主一定要明确。
drq6772 2009-06-20
  • 打赏
  • 举报
回复
别光说答案,我想知道的是原理。
只给出答案的不能给分,抱歉!
gleen 2009-06-20
  • 打赏
  • 举报
回复
静态变量
loveisbug 2009-06-20
  • 打赏
  • 举报
回复
C
mengde007 2009-06-20
  • 打赏
  • 举报
回复
C
加载更多回复(1)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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