乾丰小何啊 發表於 2023-7-5 00:00:00

详解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()) &lt; 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) &lt; 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 &lt;sys/wait.h&gt;</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()) &lt; 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()) &lt; 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 &gt; 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) &lt; 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 &lt;signal.h&gt;</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&lt;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()) &lt; 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 &lt;signal.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;sys/wait.h&gt;</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&lt;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()) &lt; 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) &lt; 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]
查看完整版本: 详解linux下避免僵尸进程的几种方法