详解linux下避免僵尸进程的几种方法
<p>linux下我们可以调用fork函数创建子进程,创建的子进程将会得到父进程的数据空间、堆、栈......副本(采用写时复制机制),子进程将会继承父进程的信号掩码、信号处理方式、当前工作目录、会话id、组id......。当子进程退出时父进程应当及时获取子进程退出状态,否则,如果父进程是一直在运行,那么子进程的退出状态将一直保存在内存中,直到父进程退出才释放。</p>
<p>
我们可以使用如下几种方法避免僵尸进程的产生:</p>
<p>
1.在fork后调用wait/waitpid函数取得子进程退出状态。</p>
<p>
2.调用fork两次(第一次调用产生一个子进程,第二次调用fork是在第一个子进程中调用,同时将父进程退出(第一个子进程退出),此时的第二个子进程的父进程id为init进程id(注意:新版本Ubuntu并不是init的进程id))。</p>
<p>
3.在程序中显示忽略SIGCHLD信号(子进程退出时会产生一个SIGCHLD信号,我们显示忽略此信号即可)。</p>
<p>
4.捕获SIGCHLD信号并在捕获程序中调用wait/waitpid函数。</p>
<p>
方法一:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_599549">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp preprocessor">#include "../common/common.h"</code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp keyword bold">void</code><code class="cpp plain">)</code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pid_t pid;</code>
</div>
<div class="line number5 index4 alt2">
</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()) < 0) {</code>
</div>
<div class="line number7 index6 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 number8 index7 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_FAILURE;</code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(0 == pid) {</code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"[%ld] child process is running...\n"</code><code class="cpp plain">, (</code><code class="cpp color1 bold">long</code><code class="cpp plain">)getpid());</code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">_exit(0);</code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">//sleep(15);</code>
</div>
<div class="line number15 index14 alt2">
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(waitpid(pid, NULL, 0) < 0) {</code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"waitpid error"</code><code class="cpp plain">);</code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_FAILURE;</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number20 index19 alt1">
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(; ;) {</code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pause();</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 spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_SUCCESS;</code>
</div>
<div class="line number25 index24 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>
方法二:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_496450">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp preprocessor">#include <sys/wait.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include "../common/common.h"</code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp keyword bold">void</code><code class="cpp plain">)</code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp plain">{</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">
</div>
<div class="line number7 index6 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid = fork()) < 0) {</code>
</div>
<div class="line number8 index7 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 number9 index8 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_FAILURE;</code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(0 == pid) {</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">"first child is running..\n"</code><code class="cpp plain">); </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">/**在第一个子进程中再次fork***/</code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid = fork()) < 0) {</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">"fork error"</code><code class="cpp plain">);</code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</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><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">/**父进程退出**/</code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"[%ld] first child is exit...\n"</code><code class="cpp plain">, (</code><code class="cpp color1 bold">long</code><code class="cpp plain">)getpid());</code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">_exit(0);</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number20 index19 alt1">
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">sleep(2);</code><code class="cpp comments">/**确保父进程先运行**/</code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"second process pid: %ld, second process's parent pid: %ld\n"</code><code class="cpp plain">, (</code><code class="cpp color1 bold">long</code><code class="cpp plain">)getpid(), (</code><code class="cpp color1 bold">long</code><code class="cpp plain">)getppid()); </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">//sleep(15);</code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"[%ld] is exit..\n"</code><code class="cpp plain">, (</code><code class="cpp color1 bold">long</code><code class="cpp plain">)getpid());</code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">_exit(0);</code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number27 index26 alt2">
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">/***获得第一个子进程的退出状态***/</code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(waitpid(pid, NULL, 0) < 0) {</code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"waitpid error"</code><code class="cpp plain">);</code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_FAILURE;</code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number33 index32 alt2">
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code><code class="cpp plain">(;;)</code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">pause();</code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_SUCCESS;</code>
</div>
<div class="line number37 index36 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>
方法三:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_336608">
<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>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp preprocessor">#include <signal.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include "../common/common.h"</code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp keyword bold">void</code><code class="cpp plain">)</code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">/***显示忽略SIGCHLD信号****/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(</code><code class="cpp functions bold">signal</code><code class="cpp plain">(SIGCHLD, SIG_IGN) == SIG_ERR) {</code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"signal error"</code><code class="cpp plain">);</code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_SUCCESS;</code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">pid_t pid;</code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i;</code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">/**产生10个子进程***/</code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(i=0; i<10; ++i) {</code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid = fork()) < 0) {</code>
</div>
<div class="line number16 index15 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 number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_FAILURE;</code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(0 == pid) {</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">_exit(0);</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 plain">sleep(2);</code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">continue</code><code class="cpp plain">;</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">
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(; ;)</code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pause();</code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">EXIT_SUCCESS;</code>
</div>
<div class="line number28 index27 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_189955">
<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>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp preprocessor">#include <signal.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <sys/wait.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include "../common/common.h"</code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sig_chld(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">signo);</code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp keyword bold">void</code><code class="cpp plain">)</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp plain">{</code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">/**捕获此信号, 此刻系统会立刻检测是否有次信号产生**/</code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(</code><code class="cpp functions bold">signal</code><code class="cpp plain">(SIGCHLD, sig_chld) == SIG_ERR) {</code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">handler_err(</code><code class="cpp string">"signal error to SIGCHLD"</code><code class="cpp plain">);</code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number11 index10 alt2">
</div>
<div class="line number12 index11 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pid_t pid;</code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i;</code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(i=0; i<10; i++) {</code>
</div>
<div class="line number15 index14 alt2">
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">((pid = fork()) < 0) {</code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">handler_err(</code><code class="cpp string">"fork error"</code><code class="cpp plain">);</code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code> <code class="cpp plain">(0 == pid) {</code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"child pid: %d\n"</code><code class="cpp plain">, getpid());</code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">_exit(0);</code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number22 index21 alt1">
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">sleep(1);</code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">continue</code><code class="cpp plain">;</code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number26 index25 alt1">
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(; ;) {</code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">pause();</code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </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">EXIT_SUCCESS;</code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp plain">}</code>
</div>
<div class="line number32 index31 alt1">
</div>
<div class="line number33 index32 alt2">
<code class="cpp comments">/**捕获到信号后会立刻执行此段代码***/</code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp keyword bold">void</code> <code class="cpp plain">sig_chld(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">signo)</code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp plain">{</code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"receive child signal\n"</code><code class="cpp plain">);</code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(waitpid(-1, NULL, 0) < 0) {</code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"waitpid error"</code><code class="cpp plain">);</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">
</div>
<div class="line number41 index40 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(</code><code class="cpp functions bold">signal</code><code class="cpp plain">(SIGCHLD, sig_chld) == SIG_ERR) {</code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">perror</code><code class="cpp plain">(</code><code class="cpp string">"signal error to SIGCHLD"</code><code class="cpp plain">);</code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">}</code>
</div>
<div class="line number44 index43 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>
<p>
原文链接:http://blog.csdn.net/ComingFlying/article/details/76718809</p>
頁:
[1]