Linu下fork运行机制

上传人:夏** 文档编号:562440464 上传时间:2023-03-03 格式:DOCX 页数:8 大小:92.81KB
返回 下载 相关 举报
Linu下fork运行机制_第1页
第1页 / 共8页
Linu下fork运行机制_第2页
第2页 / 共8页
Linu下fork运行机制_第3页
第3页 / 共8页
Linu下fork运行机制_第4页
第4页 / 共8页
Linu下fork运行机制_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Linu下fork运行机制》由会员分享,可在线阅读,更多相关《Linu下fork运行机制(8页珍藏版)》请在金锄头文库上搜索。

1、从一道面试题谈 linux 下 fork 的运行机制一位朋友去一个不错的外企面试 linux 开发职位,面试官出 了一个如下的题目:给出如下C程序,在linux下使用gcc编译:1 #include stdio.h2 #include sys/typesh3 #include unistdh45 intmain。6 7pid_t pid1;8pid_t pid2;910pid1 = fork();11pid2 = fork();1213printf(pid1:%d, pid2:%dn, pid1, pid2);14 要求如下: 已知从这个程序执行到这个程序的所有进程结 束这个时间段内,没有其它

2、新进程执行。1、请说出执行这个程序后,将一共运行几个进程。2、如果其中一个进程的输出结果是“pid1:1001,pid2:1002”,写出其他进程的输出结果(不考虑进程执 行顺序)。明显这道题的目的是考察linux下fork的执行机制。下 面我们通过分析这个题目,谈谈linux下fork的运行机制。 预备知识1、进程可以看做程序的一次执行过程。在 linux 下,每个 进程有唯一的PID标识进程。PID是一个从1到32768的正 整数,其中1 一般是特殊进程init,其它进程从2开始依次 编号。当用完32768后,从2重新开始。2、linux中有一个叫进程表的结构用来存储当前正在运行的 进程。

3、可以使用“ps aux”命令查看所有正在运行的进程。3、进程在 linux 中呈树状结构, init 为根节点,其它进程 均有父进程,某进程的父进程就是启动这个进程的进程,这 个进程叫做父进程的子进程。4、fork 的作用是复制一个与当前进程一样的进程。新进程 的所有数据(变量、环境变量、程序计数器等)数值都和原 进程一致,但是是一个全新的进程,并作为原进程的子进程。有了上面的预备知识,我们再来看看解题的关键。我认为, 解题的关键就是要认识到fork将程序切成两段。看下图:上图表示一个含有 fork 的程序,而 fork 语句可以看成将程序切为A、B两个部分。然后整个程序会如下运行:stepl

4、、设由shell直接执行程序,生成了进程P。P执行 完 Part. A 的所有代码。step2、当执行到pid二fork。;时,P启动一个进程Q, Q 是P的子进程,和P是同一个程序的进程。Q继承P的所有 变量、环境变量、程序计数器的当前值。step3、在P进程中,fork()将Q的PID返回给变量pid, 并继续执行Part. B的代码。step4、在进程Q中,将0赋给pid,并继续执行Part. B 的代码。这里有三个点非常关键:1、P执行了所有程序,而Q只执行了 Part. B,即fork。 后面的程序。(这是因为Q继承了 P的PC-程序计数器)2、Q 继承了 fork() 语句执行时当

5、前的环境,而不是程序的 初始环境。3、P中fork。语句启动子进程Q,并将Q的PID返回,而Q 中的 fork() 语句不启动新进程,仅将 0返回。解题下面利用上文阐述的知识进行解题。这里我把两个问题放 在一起进行分析。1、从shell中执行此程序,启动了一个进程,我们设这 个进程为P0,设其PID为XXX (解题过程不需知道其PID)。2、当执行到pidl = fork();时,P0启动一个子进程P1, 由题目知 P1 的 PID 为 1001。我们暂且不管 P1。3、P0中的fork返回1001给pid1,继续执行到pid2 = fork();,此时启动另一个新进程,设为P2,由题目知P2

6、 的 PID 为 1002。同样暂且不管 P2。4、P0中的第二个fork返回1002给pid2,继续执行完后 续程序,结束。所以,P0的结果为“pid1:1001, pid2:1002”。5、再看P2, P2生成时,P0中pid1=1001,所以P2中pidl 继承P0的1001,而作为子进程pid2=0。P2从第二个fork 后开始执行,结束后输出“ pid1:1001, pid2:0”。6、接着看P1, P1中第一条fork返回0给pidl,然后接 着执行后面的语句。而后面接着的语句是pid2 = fork。; 执行到这里,P1又产生了一个新进程,设为P3。先不管P3。7、P1中第二条f

7、ork将P3的PID返回给pid2,由预备知 识知P3的PID为1003,所以P1的pid2=1003。P1继续执行 后续程序,结束,输出“ pid1:0, pid2:1003”。8、P3作为P1的子进程,继承P1中pid1=0,并且第二条 fork将0返回给pid2,所以P3最后输出“pid1:0, pid2:0”。9、至此,整个执行过程完毕。所得答案:1、一共执行了四个进程。(P0, P1, P2, P3)2、另外几个进程的输出分别为:pid1:1001, pid2:0pid1:0, pid2:1003 pid1:0, pid2:0进一步可以给出一个以P0为根的进程树:P0piPIDiXX

8、XPID;1002PID:1003PID:1001验证F面我们去linux下实际执行这个程序,来验证我们的答案。程序如下图:文件 编辑 查看 回滚 书签 设置 帮助include stdio.h#include sys/types.h#inelude unistd.hint maiin ()pidt pidl;pidt pid2;pidl = fork();pid2 = fork(printf(pidljd, pid2:dn, pidl, pid2);forktest.c 14Lf 196C用gec编译、执行后结果如下:由于我们不太可能刚巧碰上PID分配到1001的情况,所以 具体数值可能和答案有所差别。不过将这里的 2710 看做基 数的话,结果和我们上面的解答是一致的。总结应该说这不是一道特别难或特别刁钻的题目,但是由于 fork 函数运行机制的复杂性,造就了当两个 fork 并排时, 问题就变得很复杂。解这个题的关键,一是要对linux下进 程的机制有一定认识,二是抓住上文提到的几个关于 fork 的关键点。朋友说,这个题给的时间是 5分钟,应该说时间 还算充裕,但是在面试的场合下,还是很考验一个人对进程、 fork 的掌握程度和现场推理能力。希望本文能帮助朋友们对 fork 的执行机制有一个明晰的 认识。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号