卖酒的老吴 發表於 2023-8-17 00:00:00

浅谈Linux vfork与fork简单对比分析

<p>
        本文分享了linux vfork与fork简单对比分析,分享给大家,具体如下:</p>
<p>
        <span><strong>fork相关问题:</strong></span></p>
<p>
        <strong>一、fork基础了解</strong></p>
<p>
        fork作用为创建一个子进程,在使用了fork命令后,内核会分配新的内存块和数据结构给子进程,并且将父进程的部分数据结构内容拷贝到子进程,最后再将子进程添加到系统进程列表中,添加完成后fork返回,开始调度。</p>
<p>
        头文件:#include &lt; unistd.h &gt;</p>
<p>
        函数原型:pid_t fork( )</p>
<p>
        返回值:返回值大于0则当前进程为父进程,等于0代表为子进程,小于零代表创建子进程失败。</p>
<p>
        通过一个例子来了解:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_869600">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces">   </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp color1 bold">int</code> <code class="cpp plain">tmp = 5;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">pid_t res = fork();</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">if</code><code class="cpp plain">(res &lt; 0){</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">//fork失败</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"fork"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(res == 0){</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">//该进程为子进程</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"im child[%d],fasther is %d,tmp is %d.\n"</code><code class="cpp plain">,getpid(),getppid(),tmp++);</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code><code class="cpp keyword bold">else</code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">//该进程为父进程</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"im father[%d],tmp is %d.\n"</code><code class="cpp plain">,getpid(),tmp++);</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"tmp = %d\n"</code><code class="cpp plain">,tmp);</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        运行结果:</p>
<p>
        im father,tmp is 5.<br>
        tmp = 6<br>
        im child,fasther is 1,tmp is 5.<br>
        tmp = 6</p>
<p>
        <strong>相关问题小结:</strong></p>
<p>
        通过结果很明显的能看出本次调用中,先执行父进程,对应pid为3128,在父进程中tmp++,所以输出为6;关键问题在于子进程,有两个关键点。</p>
<p>
        ①为什么结果中子进程父亲pid为1:通过输出我们能看出父进程先执行完成后才执行的子进程,也就是说当子进程执行时父进程已结束,此时该子进程相当于一个孤儿进程,被pid为1也就是init进程所管理,所以子进程的ppid为1;</p>
<p>
        ②为什么子进程最后输出tmp值还为6: fork进程采用的是写时拷贝,父子进程一开始共享一片内存区域,但是只有有一方要对数据进行修改,则再开辟一块空间,防止相互修改影响。所以在上述代码中,虽说是一个tmp,其实内存中各自保留了一份值。</p>
<p>
        <span><strong>二、关于fork过程中写时拷贝:</strong></span></p>
<p>
        <img title="浅谈Linux vfork与fork简单对比分析" alt="浅谈Linux vfork与fork简单对比分析" src="https://zhuji.jb51.net/uploads/img/202305/962e38b20bbdce7b0c4e1db8dc2f56b4.jpg"></p>
<p>
        <img title="浅谈Linux vfork与fork简单对比分析" alt="浅谈Linux vfork与fork简单对比分析" src="https://zhuji.jb51.net/uploads/img/202305/d01c5e941caf68cf0139fca6f6a4a6a0.jpg"></p>
<p>
        这下就不难看出,父子进程数据段和代码段开始时是共享一块对应的内存,当一方尝试写入时,便产生了写时拷贝。需要注意的是:fork之前,父进程独立执行,fork之后,父子两个执行流分别执行,至于谁先执行,由调度器决定。可通过下面例子很明显的看出是从fork之后才分别执行。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_278119">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp color1 bold">int</code> <code class="cpp plain">tmp = 5;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"there is fork before\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">pid_t res = fork();</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">(res &lt; 0){</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">//fork失败</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"fork"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(res == 0){</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">//该进程为子进程</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"im child[%d],tmp is %d.\n"</code><code class="cpp plain">,getpid(),tmp++);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code><code class="cpp keyword bold">else</code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp comments">//该进程为父进程</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"im father[%d],tmp is %d.\n"</code><code class="cpp plain">,getpid(),tmp++);</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"tmp = %d\n"</code><code class="cpp plain">,tmp);</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        输出结果:</p>
<p>
        there is fork before</p>
<p>
        im father,tmp is 5.</p>
<p>
        tmp = 6</p>
<p>
        im child,tmp is 5.</p>
<p>
        tmp = 6</p>
<p>
        <span><strong>三、fork调用失败的原因:</strong></span></p>
<p>
        ①系统中已经存在太多进程,无法再创建新的进程。可通过ulimit -a命令查看当前所有的资源限制。</p>
<p>
        ②内存不足,由于开辟每个新的进程都要分配一个pcb,并为新进程分配资源,内存都不足也就别提还想着再创建进程了。</p>
<p>
        <span><strong>vfork相关问题:</strong></span></p>
<p>
        <strong>一、vfork基础了解</strong></p>
<p>
        &lt;1&gt;vfork创建新进程的主要目的在于用exec函数执行另外的程序,实际上,在没调用exec或_exit之前子进程与父进程共享数据段。在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或_exit,在这以后,父子进程的执行顺序不再有限制。</p>
<p>
        头文件:#include &lt; unistd.h &gt;</p>
<p>
        函数原型:pid_t vfork( )</p>
<p>
        返回值:返回值大于0则当前进程为父进程,等于0代表为子进程,小于零代表创建子进程失败。</p>
<p>
        通过一个例子来了解:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_588837">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">tmp = 3;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">pid_t res = vfork();</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">if</code><code class="cpp plain">(res &lt; 0){</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"vfork"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">_exit();</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(res == 0){</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">tmp = 10;</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"child res = %d\n"</code><code class="cpp plain">,tmp);</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">_exit(0);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code><code class="cpp keyword bold">else</code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"father res = %d\n"</code><code class="cpp plain">,tmp);</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                         </div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        输出结果:</p>
<p>
        child res = 10</p>
<p>
        father res = 10</p>
<p>
        结果分析:正如上面所说的,子进程直接公用父进程的页表,改变子进程的数据也会影响到父进程。</p>
<p>
        <img title="浅谈Linux vfork与fork简单对比分析" alt="浅谈Linux vfork与fork简单对比分析" src="https://zhuji.jb51.net/uploads/img/202305/f3befb38f385542b410b8004a3bab1d9.jpg"></p>
<p>
        &lt;2&gt;vfork用处:</p>
<p>
        vfork()跟fork()类似,都是创建一个子进程,这两个函数的的返回值也具有相同的含义。但是vfork()创建的子进程基本上只能做一件事,那就是立即调用_exit()函数或者exec函数族成员,调用任何其它函数(包括exit())、修改任何数据(除了保存vfork()返回值的那个变量)、执行任何其它语句(包括return)都是不应该的。更需要注意的是:调用vfork()之后,父进程会一直阻塞,直到子进程调用_exit()终止,或者调用exec函数族成员。</p>
<p>
        &lt;3&gt;为什么只能用_exit退出:</p>
<p>
        exit()是对_exit()的封装,它自己在调用_exit()前会做很多清理工作,其中包括刷新并关闭当前进程使用的流缓冲(比如stdio.h里面的printf等),由于vfork()的子进程完全共享了父进程地址空间,子进程里面的流也是共享的父进程的流,所以子进程里面是不能做这些事的。直接return就更不行了,子进程return以后,会从当前函数的外部调用点后面继续执行,这后面子进程可能将会执行很多语句,结果就没法预料了。在man手册中也强调了这一点,必须使用_exit退出。</p>
<p>
        <span><strong>fork与vfork的区别 </strong></span></p>
<p>
        1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。</p>
<p>
        2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。</p>
<p>
        <strong>为什么会有vfork呢?</strong></p>
<p>
        因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,然后将会有两种行为:</p>
<p>
        1.执行从父进程那里拷贝过来的代码段</p>
<p>
        2.调用一个exec执行一个新的代码段</p>
<p>
        当进程调用exec函数时,一个新程序替换了当前进程的正文,数据,堆和栈段。这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork。vfork并不复制父进程的进程环境,子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子“霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。</p>
<p>
        因此,如果创建子进程是为了调用exec执行一个新的程序的时候,就应该使用vfork</p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:http://blog.csdn.net/sssssuuuuu666/article/details/78708577</p>
頁: [1]
查看完整版本: 浅谈Linux vfork与fork简单对比分析