<span id='snqni'></span>

    <fieldset id='snqni'></fieldset>
    <acronym id='snqni'><em id='snqni'></em><td id='snqni'><div id='snqni'></div></td></acronym><address id='snqni'><big id='snqni'><big id='snqni'></big><legend id='snqni'></legend></big></address>
  • <i id='snqni'><div id='snqni'><ins id='snqni'></ins></div></i>

    1. <tr id='snqni'><strong id='snqni'></strong><small id='snqni'></small><button id='snqni'></button><li id='snqni'><noscript id='snqni'><big id='snqni'></big><dt id='snqni'></dt></noscript></li></tr><ol id='snqni'><table id='snqni'><blockquote id='snqni'><tbody id='snqni'></tbody></blockquote></table></ol><u id='snqni'></u><kbd id='snqni'><kbd id='snqni'></kbd></kbd>

      <code id='snqni'><strong id='snqni'></strong></code>

      <dl id='snqni'></dl>

        1. <i id='snqni'></i>

          <ins id='snqni'></ins>

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

            • 时间:
            • 浏览:5
            • 来源:124软件资讯网
              今天一位朋侪去一个不错的外企面试linux开发职位  ,面试官出了一个如下的问题:

              给出如下C法式 ,在linux下使用gcc编译:


              Code highlighting produced by Actipro CodeHighlighter (freeware)
              http://www.CodeHighlighter.com/

              --> 1 #include "stdio.h"
              2 #include "sys/types.h"
              3 #include "unistd.h"
              4
              5 int main()
              6 {
              7 pid_t pid1;
              8 pid_t pid2;
              9
              10 pid1 = fork();
              11 pid2 = fork();
              12
              13 printf("pid1:%d, pid2:%d\n", pid1, pid2);
              14 }

              要求如下:

              已知从这个法式执行到这个法式的所有历程竣事这个时间段内  ,没有其它新历程执行  。

              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的作用是复制一个与当前历程一样的历程  。新历程的所有数据(变量、情况变量、法式计数器等)数值都和原历程一致  ,可是是一个全新的历程 ,并作为原历程的子历程  。

              解题的要害

              有了上面的准备知识  ,我们再来看看解题的要害 。我以为  ,解题的要害就是要熟悉到fork将法式切成两段  。看下图:

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

              上图表现一个含有fork的法式  ,而fork语句可以看成将法式切为A、B两个部门  。然后整个法式会如下运行:

              step1、设由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()语句执行时当前的情况 ,而不是法式的初始情况  。

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

              解题

              下面使用上文论述的知识进123下一页