深入解读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 <unistd.h> //fork fuction</code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <fcntl.h> //file operator</code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <sys/types.h></code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp preprocessor">#include <stdio.h> </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp preprocessor">#include <stdlib.h> //exit fuction</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <string.h></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(&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 <unistd.h> //fork fuction</code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <fcntl.h> //file operator</code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <sys/types.h></code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp preprocessor">#include <stdio.h> </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp preprocessor">#include <stdlib.h> //exit fuction</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <string.h></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<unistd.h></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 <unistd.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <stdio.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <sys/types.h></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 <unistd.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <stdio.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <sys/types.h></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 <unistd.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <stdio.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <sys/types.h></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 <unistd.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <stdio.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <sys/types.h></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]