http://www.cnblogs.com/mickole/p/3188321.html
在Linux中,守护进程有两种方式,一种是svsy方式,一种是xinetd方式(超级守护进程)。
每个守护进程都会有一个脚本,可以理解成工作配置文件,守护进程的脚本需要放在指定位置,独立启动守护进程:放在/etc/init.d/目录下,当然也包括xinet的shell脚本;超级守护进程:按照xinet中脚本的指示,它所管理的守护进程位于/et/xinetd.config目录下。
svsy:
独立启动,一开机运行就会进入内存,一直处于listen状态,即使该守护进程不运行也会一直占用系统资源,但是其最大的优点就是,它一直启动,当有请求时会立即响应,响应速度快,比如http服务,这样的进程都保存在/etc/rc.d/init.d目录下
xinet d:
超级守护进程,管理众多的进程,比如telnet服务。xinetd自己是一个sysv,它就像老板一样,自己常驻于内存,管理其它的进程,其它进程就相当于它的员工,在其它进程没有用时会睡眠,并不占用系统资源,当有工作时候老板xinetd会通知它的员工,唤醒某个进程来执行作业。这种方式适合于那些不是经常被人使用,不需要常驻内存的程序,但是此方式响应时间长,但是节省系统资源,方便管理。超级守护进程的配置文件是/etc/xinetd.conf,超级守护进程的子进程们存放在/etc/xinetd.d/目录下
守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
守护进程的名称通常以d结尾,比如sshd、xinetd、crond等
xrsync
二,创建守护进程步骤
首先我们要了解一些基本概念:
进程组 :
每个进程也属于一个进程组
每个进程主都有一个进程组号,该号等于该进程组组长的PID号 .
一个进程只能为它自己或子进程设置进程组ID号
会话期:
会话期(session)是一个或多个进程组的集合。
setsid()函数可以建立一个对话期:
如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。
(1)此进程变成该对话期的首进程
(2)此进程变成一个新进程组的组长进程。
(3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。
(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行
现在我们来给出创建守护进程所需步骤:
编写守护进程的一般步骤步骤:
(1)在父进程中执行fork并exit推出;
(2)在子进程中调用setsid函数创建新的会话;
(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
(4)在子进程中调用umask函数,设置进程的umask为0;
(5)在子进程中关闭任何不需要的文件描述符
利用库函数daemon()创建守护进程
#include <unistd.h>
int daemon(int nochdir, int noclose);
DESCRIPTION
The daemon() function is for programs wishing to detach themselves from
the controlling terminal and run in the background as system daemons.
If nochdir is zero, daemon() changes the process’s current working
directory to the root directory ("/"); otherwise,
If noclose is zero, daemon() redirects standard input, standard output
and standard error to /dev/null; otherwise, no changes are made to
these file descriptors.
功能:创建一个守护进程
参数:
nochdir:=0将当前目录更改至“/”
noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”
返回值:
成功:0
失败:-1
现在让daemon(0,1),就是不关闭标准输入输出结果:
现在让daemon(1,0),就是不重定向,结果如下:
在Linux中,守护进程有两种方式,一种是svsy方式,一种是xinetd方式(超级守护进程)。
每个守护进程都会有一个脚本,可以理解成工作配置文件,守护进程的脚本需要放在指定位置,独立启动守护进程:放在/etc/init.d/目录下,当然也包括xinet的shell脚本;超级守护进程:按照xinet中脚本的指示,它所管理的守护进程位于/et/xinetd.config目录下。
svsy:
独立启动,一开机运行就会进入内存,一直处于listen状态,即使该守护进程不运行也会一直占用系统资源,但是其最大的优点就是,它一直启动,当有请求时会立即响应,响应速度快,比如http服务,这样的进程都保存在/etc/rc.d/init.d目录下
xinet d:
超级守护进程,管理众多的进程,比如telnet服务。xinetd自己是一个sysv,它就像老板一样,自己常驻于内存,管理其它的进程,其它进程就相当于它的员工,在其它进程没有用时会睡眠,并不占用系统资源,当有工作时候老板xinetd会通知它的员工,唤醒某个进程来执行作业。这种方式适合于那些不是经常被人使用,不需要常驻内存的程序,但是此方式响应时间长,但是节省系统资源,方便管理。超级守护进程的配置文件是/etc/xinetd.conf,超级守护进程的子进程们存放在/etc/xinetd.d/目录下
守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
守护进程的名称通常以d结尾,比如sshd、xinetd、crond等
xrsync
二,创建守护进程步骤
首先我们要了解一些基本概念:
进程组 :
每个进程也属于一个进程组
每个进程主都有一个进程组号,该号等于该进程组组长的PID号 .
一个进程只能为它自己或子进程设置进程组ID号
会话期:
会话期(session)是一个或多个进程组的集合。
setsid()函数可以建立一个对话期:
如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。
(1)此进程变成该对话期的首进程
(2)此进程变成一个新进程组的组长进程。
(3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。 如果该进程是一个进程组的组长,此函数返回错误。
(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行
现在我们来给出创建守护进程所需步骤:
编写守护进程的一般步骤步骤:
(1)在父进程中执行fork并exit推出;
(2)在子进程中调用setsid函数创建新的会话;
(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
(4)在子进程中调用umask函数,设置进程的umask为0;
(5)在子进程中关闭任何不需要的文件描述符
利用库函数daemon()创建守护进程
#include <unistd.h>
int daemon(int nochdir, int noclose);
DESCRIPTION
The daemon() function is for programs wishing to detach themselves from
the controlling terminal and run in the background as system daemons.
If nochdir is zero, daemon() changes the process’s current working
directory to the root directory ("/"); otherwise,
If noclose is zero, daemon() redirects standard input, standard output
and standard error to /dev/null; otherwise, no changes are made to
these file descriptors.
功能:创建一个守护进程
参数:
nochdir:=0将当前目录更改至“/”
noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null”
返回值:
成功:0
失败:-1
现在让daemon(0,1),就是不关闭标准输入输出结果:
现在让daemon(1,0),就是不重定向,结果如下: