社区
C++ 语言
帖子详情
父进程创建子进程的资源共享问题
drq6772
2009-06-20 09:02:07
看到操作系统书上说,父进程执行fork()系统调用之后创建子进程,父进程与子进程各自拥有独立的地址空间。
以上的说法是否说明父进程与子进程除了共享代码段之外没有任何关联?
昨天去一家公司笔试,笔试题如下(不定项选择):
当父进程调用fork()创建子进程之后,下列哪些变量在子进程中修改之后,父进程里也会相应地作出改动?
A.全局变量
B.局部变量
C.静态变量
D.文件指针
请大家详细分析一下,主要就是父进程和子进程的资源共享问题,我搞得很模糊。
...全文
5828
23
打赏
收藏
父进程创建子进程的资源共享问题
看到操作系统书上说,父进程执行fork()系统调用之后创建子进程,父进程与子进程各自拥有独立的地址空间。 以上的说法是否说明父进程与子进程除了共享代码段之外没有任何关联? 昨天去一家公司笔试,笔试题如下(不定项选择): 当父进程调用fork()创建子进程之后,下列哪些变量在子进程中修改之后,父进程里也会相应地作出改动? A.全局变量 B.局部变量 C.静态变量 D.文件指针 请大家详细分析一下,主要就是父进程和子进程的资源共享问题,我搞得很模糊。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
程序的陈
2010-11-06
打赏
举报
回复
小梁我再次发现你了~
xiaocainiaoyuan
2010-05-07
打赏
举报
回复
都是高人~
lqflyc
2009-12-04
打赏
举报
回复
说C的都是做windows的
猫已经找不回了
2009-06-20
打赏
举报
回复
[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]
我理解你的意思,对文件指针进行解引用操作时,指针所指的对象发生改变,因此会影响到父进程。是这个意思吗?
猫已经找不回了
2009-06-20
打赏
举报
回复
说多了也白扯,想看得透彻,把这篇看完。
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
猫已经找不回了
2009-06-20
打赏
举报
回复
对多进程和多线程有兴趣,可以看看我这篇:
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。
父进程设置的锁,子进程不继承。
子进程的未决告警被清除。
子进程的未决信号集设置为空集。
猫已经找不回了
2009-06-20
打赏
举报
回复
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)
Linux
进程
管理命令 < Series 9. >
:通过
进程
"名"(nginx)终止
进程
(
父
/
子
进程
) 06/15)命令 pkill :通过
进程
"名"终止
进程
(通杀)/终止客户端(pst/tty) 07/15)命令 top :实时显示系统中各个...
python:
父
进程
、
子
进程
、线程的原理以及
创建
关于资源:
子
进程
得到的是除了代码段是与
父
进程
共享的意外,其他所有的都是得到
父
进程
的一个副本,
子
进程
的所有资源都继承
父
进程
,得到
父
进程
资源的副本。 2、线程与
进程
之间的关系 一个
进程
的线程之间共享由
进程
...
父
进程
在
创建
子
进程
之后,哪些东西共享,哪些东西不共享?
fork的一个特性是
父
进程
所有的打开文件描述符(file_struct)都被复制到
子
进程
中,
父
子
进程
的每个相同的打开描述符共享一个文件表项如图。 在linux系统中的具体实现可用下图表示(说明:
进程
的fs_struct也会被复制...
Linux 的
父
进程
和
子
进程
的执行情况(附有案例代码)
在Linux里,除了
进程
0以外的所有
进程
都是由其他
进程
使用系统调用fork()函数
创建
的,这里调用fork()函数
创建
新
进程
的
进程
即为
父
进程
,而相对应的为其
创建
出的
进程
则为
子
进程
,因而除了
进程
0以外的
进程
都只有一个
父
...
父
进程
与
子
进程
、线程与
进程
之间的关系
资源:
子
进程
得到的是除了代码段是与
父
进程
共享的,其他所有的都是得到
父
进程
的一个副本,
子
进程
的所有资源都继承
父
进程
,得到
父
进程
资源的副本,所以二者并不共享地址空间。两个是单独的
进程
,
进程
具有私有地址空间...
C++ 语言
64,682
社区成员
250,490
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章