首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-09-02 
父进程创建子进程的资源共享问题看到操作系统书上说,父进程执行fork()系统调用之后创建子进程,父进程与子

父进程创建子进程的资源共享问题
看到操作系统书上说,父进程执行fork()系统调用之后创建子进程,父进程与子进程各自拥有独立的地址空间。

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

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

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


请大家详细分析一下,主要就是父进程和子进程的资源共享问题,我搞得很模糊。

[解决办法]
fork 是 linux 的。多进程的概念也是LINUX的。WIN下讲究的是多线程。

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

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

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

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

父子进程没有资源共享的事儿,父子进程的一切变量都互不干扰,楼主一定要明确。
[解决办法]
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里啊。

[解决办法]

探讨
别光说答案,我想知道的是原理。
只给出答案的不能给分,抱歉!

热点排行