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 <stdio.h></code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp preprocessor">#include <sys/types.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp preprocessor">#include <unistd.h></code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp preprocessor">#include <fcntl.h></code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp preprocessor">#include <sys/stat.h></code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <stdlib.h></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<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>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<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]