关闭

Linux Advance--从一道题谈linux下fork的运行机制

标签: linux
268人阅读 评论(0) 收藏 举报
分类:

首先上代码:

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t p1, p2;

    p1 = fork();
    p2 = fork();

    printf("pid1:%d, pid2:%d\n", p1, p2);
}

 要求如下:

      已知从这个程序执行到这个程序的所有进程结束这个时间段内,没有其它新进程执行。

      1、请说出执行这个程序后,将一共运行几个进程。

      2、如果其中一个进程的输出结果是“pid1:1001, pid2:1002”,写出其他进程的输出结果(不考虑进程执行顺序)。

      明显这道题的目的是考察linux下fork的执行机制。下面我们通过分析这个题目,谈谈linux下fork的运行机制。


这里先列出一些必要的预备知识,对linux下进程机制比较熟悉的朋友可以略过。

      1、进程可以看做程序的一次执行过程。在linux下,每个进程有唯一的PID标识进程。PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号。当用完32768后,从2重新开始。

      2、linux中有一个叫进程表的结构用来存储当前正在运行的进程。可以使用“ps aux”命令查看所有正在运行的进程。

      3、进程在linux中呈树状结构,init为根节点,其它进程均有父进程,某进程的父进程就是启动这个进程的进程,这个进程叫做父进程的子进程。

      4、fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。


设父进程为P,子进程为Q,若P在Part.A部分和Part.B部分之间调用fork,则可得出以下结论:


 这里有三个点非常关键:

      1、P执行了所有程序,而Q只执行了Part. B,即fork()后面的程序。(这是因为Q继承了P的PC-程序计数器

      2、Q继承了fork()语句执行时当前的环境,而不是程序的初始环境。

      3、P中fork()语句启动子进程Q,并将Q的PID返回,而Q中的fork()语句不启动新进程,仅将0返回。


下面利用上文阐述的知识进行解题。这里我把两个问题放在一起进行分析。

      1、从shell中执行此程序,启动了一个进程,我们设这个进程为P0,设其PID为XXX(解题过程不需知道其PID)。

      2、当执行到pid1 = fork();时,P0启动一个子进程P1,由题目知P1的PID为1001。我们暂且不管P1。

      3、P0中的fork返回1001给pid1,继续执行到pid2 = fork();,此时启动另一个新进程,设为P2,由题目知P2的PID为1002。同样暂且不管P2。

      4、P0中的第二个fork返回1002给pid2,继续执行完后续程序,结束。所以,P0的结果为“pid1:1001, pid2:1002”。

      5、再看P2,P2生成时,P0中pid1=1001,所以P2中pid1继承P0的1001,而作为子进程pid2=0。P2从第二个fork后开始执行,结束后输出“pid1:1001, pid2:0”。

      6、接着看P1,P1中第一条fork返回0给pid1,然后接着执行后面的语句。而后面接着的语句是pid2 = fork();执行到这里,P1又产生了一个新进程,设为P3。先不管P3。

      7、P1中第二条fork将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:0

      pid1:0, pid2:1003

      pid1:0, pid2:0

      进一步可以给出一个以P0为根的进程树:



点击查看原文

1
0
查看评论

从一道面试题谈linux下fork的运行机制【ZT】

<br />给出如下C程序,在linux下使用gcc编译:<br /> 1 #include "stdio.h" 2 #include "sys/types.h" 3 #include "unistd.h...
  • bluebubble
  • bluebubble
  • 2011-04-06 22:23
  • 209

从一道面试题谈linux下fork的运行机制

文章出处:http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html 今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目:    &#...
  • ixidof
  • ixidof
  • 2013-09-23 21:26
  • 733

从一道面试题谈Linux下fork的运行机制

某外企面试linux开发职位面试题:给出如下C程序,在linux下使用gcc编译:#include "stdio.h"#include "sys/types.h"#include "unistd.h"int main(void){ p...
  • EmbededSwordman
  • EmbededSwordman
  • 2010-04-16 15:39
  • 605

[转]从一道面试题谈linux下fork的运行机制

原文:http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html 今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目:   ...
  • u011866460
  • u011866460
  • 2015-01-06 12:06
  • 376

通过一道面试题谈linux下的fork运行机制

fork()的返回值指明的是进程运行的上下文环境。 如: pid_t pid; pid = fork(); if(pid>0) { /*如果返回值大于零,表明处于父进程上下文环境中,返回值是子进程的ID号*/ } else if(pid == 0) { /*返回值为零,表明处于子...
  • buaa_shang
  • buaa_shang
  • 2012-12-02 20:55
  • 1017

LINUX下FORK的运行机制详细解析

摘要:由于fork函数运行机制的复杂性,造就了当两个fork并排时,问题就变得很复杂。解这个题的关键,一是要对linux下进程的机制有一定认识,二是抓住上文提到的几个关于fork的关键点。       今天一位朋友去一个不错的外企面...
  • a8082649
  • a8082649
  • 2013-11-24 11:04
  • 478

linux下fork()的运行机制

链接:http://www.cnblogs.com/leoo2sk/archive/2009/12/11/talk-about-fork-in-linux.html
  • chuncaijiayou
  • chuncaijiayou
  • 2014-02-10 16:01
  • 345

linux下fork的运行机制

如下C程序,在linux下使用gcc编译:1#include "stdio.h"2#include "sys/types.h"3#include "unistd.h" int main()4{5    pi...
  • xuechongyang
  • xuechongyang
  • 2011-05-21 16:14
  • 1172

linux中fork和exec

学过C语言的都知道,Unix下某个进程的内存分成三部分:代码段,堆栈段,数据段。代码段用来存放程序运行的代码,堆栈段用来存放子程序的局部变量,数据段用来存放全局变量。这在perl里也是一样的。perl的fork调用,跟C的一样,当发生fork调用时,实际上发生如下事:父进程将代码段,堆栈段,数据段完...
  • wfq_1985
  • wfq_1985
  • 2010-03-29 21:17
  • 2330

fork()的一道题

今天看博客的时候发现了这篇文章,作为最近有意向的的Linux,还是看了下,发现自己对fork()的理解确实是汗颜,硬是没弄明白,如下: 自己的分析稍后给出。。。。 下边原文:链接 #include #include #include int main(void) ...
  • chengshuguang
  • chengshuguang
  • 2013-11-02 16:54
  • 423
    个人资料
    • 访问:559958次
    • 积分:10878
    • 等级:
    • 排名:第1783名
    • 原创:517篇
    • 转载:3篇
    • 译文:0篇
    • 评论:45条