用心打字 發表於 2023-9-9 00:00:00

linux下如何创建守护进程的步骤

<p>
        这两天学习了linux 守护进程这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。</p>
<p>
        <strong>1,进程的概念:程序的一次动态执行过程。 </strong></p>
<p>
        进程存在于内存当中,存在着  创建,调度,执行和消亡,进程号是进程的唯一标志,每一个进程都有自己独立的内存空间,在32位操作系统中,进程拥有0-4G的内存空间,其中0-3G属于用户,3G-4G属于内核,所以就出现了进程的执行模式:用户模式和内核模式。 </p>
<p>
        <strong>2,进程的类型:</strong>交互进程,批处理进程,守护进程 </p>
<p>
        <strong>3,守护进程:</strong>Linux中的后台服务进程,daemon进程 </p>
<p>
        <strong>4,守护进程的创建步骤: </strong></p>
<p>
        (1)创建子进程,父进程退出。 </p>
<p>
        经过这步以后,子进程就会成为孤儿进程(父进程先于子进程退出, 此时的子进程,成为孤儿进程,会被init进程收养)。使用fork()函数,如果返回值大于0,表示为父进程,exit(0),父进程退出,子进程继续。 </p>
<p>
        (2)在子进程中创建新会话,使当前进程成为新会话组的组长。 </p>
<p>
        使用setsid()函数,如果当前进程不是进程组的组长,则为当前进程创建一个新的会话期,使当前进程成为这个会话组的首进程,成为这个进程组的组长。 </p>
<p>
        (3)改变当前目录为根目录。 </p>
<p>
        由于守护进程在后台运行,开始于系统开启,终止于系统关闭,所以要将其目录改为系统的根目录下。进程在执行时,其文件系统不能被卸下。 </p>
<p>
        (4)重新设置文件权限掩码。 </p>
<p>
        进程从父进程那里继承了文件创建掩码,所以可能会修改守护进程存取权限位,所以要将文件创建掩码清除,umask(0); </p>
<p>
        (5)关闭文件描述符。 </p>
<p>
        子进程从父进程那里继承了打开文件描述符。所以使用close即可关闭。 </p>
<p>
        在这里要用到getdtablesize()函数得到这个进程打开文件的数目。 </p>
<p>
        按照上面的步骤即可完成守护进程的创建。 </p>
<p>
        具体的代码如下,守护进程的功能写的较为简单,往文件里写东西: </p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_498610">
                        <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;stdio.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;sys/types.h&gt;</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;unistd.h&gt;</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;fcntl.h&gt;</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#include &lt;sys/stat.h&gt;</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp preprocessor">#include &lt;stdlib.h&gt;</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                         </div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp color1 bold">int</code> <code class="cpp plain">main()</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp plain">{   </code><code class="cpp comments">// 1创建子进程 ,父进程退出</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">pid_t pid = fork();</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">if</code><code class="cpp plain">(pid&lt;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">
                                                                        <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 number14 index13 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1;</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(pid&gt;0)</code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp functions bold">exit</code><code class="cpp plain">(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">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">else</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">
                                                                        <code class="cpp spaces">    </code><code class="cpp keyword bold">while</code><code class="cpp plain">(1)</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 comments">//2 组长</code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">setsid();</code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp comments">// 改变路径至根目录</code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">chdir(</code><code class="cpp string">"/tmp"</code><code class="cpp plain">); </code>
</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 plain">umask(0);</code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp comments">//关闭文件描述符</code>
</div>
                                                                <div class="line number31 index30 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp color1 bold">int</code> <code class="cpp plain">des=getdtablesize();</code>
</div>
                                                                <div class="line number32 index31 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp color1 bold">int</code> <code class="cpp plain">i=0;</code>
</div>
                                                                <div class="line number33 index32 alt2">
                                                                        <code class="cpp spaces">      </code><code class="cpp keyword bold">for</code><code class="cpp plain">(i=0;i&lt;des;i++)</code>
</div>
                                                                <div class="line number34 index33 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">{</code>
</div>
                                                                <div class="line number35 index34 alt2">
                                                                        <code class="cpp spaces">        </code><code class="cpp plain">close(i);</code>
</div>
                                                                <div class="line number36 index35 alt1">
                                                                        <code class="cpp spaces">      </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number37 index36 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">} </code>
</div>
                                                                <div class="line number38 index37 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp color1 bold">char</code> <code class="cpp plain">buf[]=</code><code class="cpp string">"bat xld come!\n"</code><code class="cpp plain">;</code>
</div>
                                                                <div class="line number39 index38 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp color1 bold">int</code> <code class="cpp plain">fd=open(</code><code class="cpp string">"xld.txt"</code><code class="cpp plain">,O_WRONLY|O_CREAT |O_APPEND,0666);</code>
</div>
                                                                <div class="line number40 index39 alt1">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">write(fd,buf,</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(buf));</code>
</div>
                                                                <div class="line number41 index40 alt2">
                                                                        <code class="cpp spaces">     </code><code class="cpp plain">sleep(2);</code>
</div>
                                                                <div class="line number42 index41 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">}</code>
</div>
                                                                <div class="line number43 index42 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0;</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/xld_hung/article/details/75208190</p>
頁: [1]
查看完整版本: linux下如何创建守护进程的步骤