瑞福源大碗面 發表於 2023-7-19 00:00:00

深入解读Linux进程函数fork(),vfork(),execX()

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
        <span>函数fork()</span>
</li><li>
        <span>函数vfork()</span>
</li><li>
        <span>函数exec X()系列函数</span>
</li><li>
        <span>总结</span>
</li></ul></div><p>
        本文研究的主要是Linux进程函数fork(),vfork(),execX()的相关内容,具体介绍如下。</p>
<p class="maodian"></p><h2>
        <span>函数fork()</span>
</h2>
<p>
        fork函数:创建一个新进程</p>
<blockquote>
        1、fork()成功后,将为子进程申请PCB和用户内存空间。<br>
        2、子进程会复制父进程用户空间的所有数据(代码段、数据段、BSS、堆、栈),文件描述符。<br>
        3、复制父亲进程PCB中绝大多数信息。<br>
        4、虽然子进程复制了文件描述符,而对于文件描述符相关的文件表项(struct file结构),则采用共享的方式。</blockquote>
<p>
        一个实例:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_26896">
                        <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>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                        <div class="line number31 index30 alt2">
                                                                31</div>
                                                        <div class="line number32 index31 alt1">
                                                                32</div>
                                                        <div class="line number33 index32 alt2">
                                                                33</div>
                                                        <div class="line number34 index33 alt1">
                                                                34</div>
                                                        <div class="line number35 index34 alt2">
                                                                35</div>
                                                        <div class="line number36 index35 alt1">
                                                                36</div>
                                                        <div class="line number37 index36 alt2">
                                                                37</div>
                                                        <div class="line number38 index37 alt1">
                                                                38</div>
                                                        <div class="line number39 index38 alt2">
                                                                39</div>
                                                        <div class="line number40 index39 alt1">
                                                                40</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt; //fork fuction</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;fcntl.h&gt; //file operator</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdlib.h&gt; //exit fuction</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;string.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main() {</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pid_t pid;</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i=1; </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">status;</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*ch1=</code><code class="cpp string">"hello"</code><code class="cpp plain">,*ch2=</code><code class="cpp string">"world"</code><code class="cpp plain">,*ch3=</code><code class="cpp string">"IN"</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">fd;</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((fd=open(</code><code class="cpp string">"fork.txt"</code><code class="cpp plain">,O_RDWR|O_CREAT,0644))==-1) {</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"not open"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">exit</code><code class="cpp plain">(EXIT_FAILURE);</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(write(fd,ch1,</code><code class="cpp functions bold">strlen</code><code class="cpp plain">(ch1))==-1) { </code><code class="cpp comments">//write in fork.txt</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"not write"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">exit</code><code class="cpp plain">(EXIT_FAILURE);</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid=fork())==-1) {</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"fork error"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">exit</code><code class="cpp plain">(EXIT_FAILURE);</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(pid==0) {  </code><code class="cpp comments">//son process</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i=2;   </code><code class="cpp comments">//change i</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"child:i=%d\n"</code><code class="cpp plain">,i);</code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(write(fd,ch2,</code><code class="cpp functions bold">strlen</code><code class="cpp plain">(ch2))==-1)</code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"child write"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp plain">{</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">sleep(1);</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"parent:i=%d\n"</code><code class="cpp plain">,i);</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(write(fd,ch3,</code><code class="cpp functions bold">strlen</code><code class="cpp plain">(ch3))==-1)</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"child write"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">wait(&amp;status);</code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        运行:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_177756">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain"># gcc -o fork fork.c </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp plain"># ./fork </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp plain">child:i=2 </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp plain">parent:i=1</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        可以看到在子进程中改变了i的值,然而父进程i仍为1,所以说子进程和父进程有自己的用户空间。而打开所创建的fork.txt可以得到hellowordIN,父子进程共同对一个文件操作写入的数据是不交叉覆盖的,说明父子进程共享文件偏移,一次共享文件表项。</p>
<p class="maodian"></p><h2>
        <span>函数vfork()</span>
</h2>
<p>
        与fork()函数不同,vfork()函数在创建进程是并不复制父进程的地址空间,而是在必要的时候才申请新的存储空间,因此使得vfork()更有效率。</p>
<p>
        特别注意的是vfork()是共享父进程的代码以数据段。</p>
<p>
        一个例子:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_678155">
                        <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>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt; //fork fuction</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;fcntl.h&gt; //file operator</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;stdlib.h&gt; //exit fuction</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;string.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">i=10;</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main() {</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pid_t pid;</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid=fork())==-1) {</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 error"</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">exit</code><code class="cpp plain">(EXIT_FAILURE);</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(pid==0) {  </code><code class="cpp comments">//son process</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">i++;</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"child:i=%d\n"</code><code class="cpp plain">,i);</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">_exit(0);  </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 keyword bold">else</code> <code class="cpp plain">{</code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">sleep(1);</code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"parent:i=%d\n"</code><code class="cpp plain">,i);</code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        注意:上面的代码中回收子进程用的是_exit(0),如果用return 0;的话它会回收用户空间,因此在父进程调用的时候会出现段错误。</p>
<p>
        下面是调用输出结果:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_983976">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">如果以fork()创建则会输出: </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp plain"># ./fork </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp plain">child:i=11 </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp plain">parent:i=10 </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">如果改为vfork(),则: </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp plain">child:i=11 </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">parent:i=11</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p class="maodian"></p><h2>
        <span>函数exec X()系列函数</span>
</h2>
<p>
        用fork()函数创建紫禁城后,如果希望在当前子进程中运行新的程序,则可以调用execX系列函数。<br>
        注意:当进程调用exec函数后,该进程的用户空间资源完全有新程序代替。<br>
        这些函数的区别在于:</p>
<blockquote>
        <p>
                1、指示新程序的位置是路径还是文件名<br>
                2、在使用参数时是使用参数列表哈市使用argv[]数组<br>
                3、后缀有l(list)表示使用参数列表,v表示使用argv[]数组</p>
</blockquote>
<p>
        具体如下所示:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_659238">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include&lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                         </div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">execl(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*pathname,</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*arg0,...</code><code class="cpp comments">/*(char *) 0 */</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">execv(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*pathname,</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*</code><code class="cpp keyword bold">const</code> <code class="cpp plain">argv[]);</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">execle(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*pathname,</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*arg0,...</code><code class="cpp comments">/*(char *) 0</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp comments">,char *const envp[] */</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">execve(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*pathname,</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*</code><code class="cpp keyword bold">const</code> <code class="cpp plain">argv[],</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*</code><code class="cpp keyword bold">const</code> <code class="cpp plain">envp[]);</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">execlp(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*filename,</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code><code class="cpp plain">*arg0,...</code><code class="cpp comments">/*(char *) 0*/</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">execvp(</code><code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code> <code class="cpp plain">*filename, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*</code><code class="cpp keyword bold">const</code> <code class="cpp plain">argv[]);</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">fexecve(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">fd,</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*</code><code class="cpp keyword bold">const</code> <code class="cpp plain">argv[],</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*</code><code class="cpp keyword bold">const</code> <code class="cpp plain">evnp[]);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        一个实例:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_347550">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc ,</code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv[]) {</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">pid_t pid;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid=fork())==-1)</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"error"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(pid==0) </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">execl(</code><code class="cpp string">"/bin/ls"</code><code class="cpp plain">,</code><code class="cpp string">"ls"</code><code class="cpp plain">,</code><code class="cpp string">"-l"</code><code class="cpp plain">,argv,(</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)0);</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp keyword bold">else</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"father ok\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        运行可以看到在子进程中执行了ls命令。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_409052">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">$ gcc -o exec execX.c</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp plain">$ ./exec /home father ok</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <strong>//execlp()函数使用</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_262703">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc ,</code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv[]) {</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">execlp(</code><code class="cpp string">"ls"</code><code class="cpp plain">,</code><code class="cpp string">"ls"</code><code class="cpp plain">,</code><code class="cpp string">"-l"</code><code class="cpp plain">,</code><code class="cpp string">"/home"</code><code class="cpp plain">,(</code><code class="cpp color1 bold">char</code><code class="cpp plain">*)0);</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        <strong>//execv()函数的使用</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_368070">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc ,</code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv[]) {</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv1[]={</code><code class="cpp string">"ls"</code><code class="cpp plain">,</code><code class="cpp string">"-l"</code><code class="cpp plain">,</code><code class="cpp string">"/home"</code><code class="cpp plain">,0};</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">execv(</code><code class="cpp string">"/bin/ls"</code><code class="cpp plain">,argv1);</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        ecvp()会从环境变量PATH所指定的目录中查找文件名作为第一个参数,第二个及以后的参数由参数列表,注意最后一个成员必须为NULL</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_171691">
                        <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>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc ,</code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv[]) {</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces"> </code><code class="cpp color1 bold">char</code><code class="cpp plain">* argv1[]={</code><code class="cpp string">"ls"</code><code class="cpp plain">,</code><code class="cpp string">"-l"</code><code class="cpp plain">,</code><code class="cpp string">"/home"</code><code class="cpp plain">,0};</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code><code class="cpp plain">execvp(</code><code class="cpp string">"ls"</code><code class="cpp plain">,argv1);</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p class="maodian"></p><h2>
        <span>总结</span>
</h2>
<p>
        以上就是本文关于深入解读Linux进程函数fork(),vfork(),execX()的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!</p>
<p>
        原文链接:http://blog.csdn.net/taoyanqi8932/article/details/52778015</p>
頁: [1]
查看完整版本: 深入解读Linux进程函数fork(),vfork(),execX()