守护进程
Linux系统中,有一种特殊的进程,叫做守护进程。
[不好意思,开始学进程的时候,提起守护进程,还以为是进程间的一种特殊通信方式呢,嘎嘎]
守护进程,就是程序在后台默默的执行你的命令,不占用cpu的使用资源,像daemon后缀的就是守护进程
守护进程好比一个人默默地关心自己心灵深处的某个人,如果把那个人当做cpu,则守护进程不会像恋爱一样,同时占用cou的资源,使其他的用户得不到使用权限,而只是小心的付出自己的关心罢了
再比如有ftp服务器,也是守护进程
守护进程的特征
1、从linux开始启动或者命令执行时开始,这个进程就开始执行,直接主动将之退出或关机(当然守护进程也可以手动开启)
2、守护进程要脱离终端,(不会因终端关闭或没起来就结束),stdin stdout stderr都不起作用
3、守护进程的启动方法:
a: 使用/etc/rc.d 脚本登记要启动的进程程序
b: 利用inetd超级服务器启动。Service 举例: smbd start/stop
c: cron命令定时启动。
说到这里,我想起了火车订票系统,过了11点好像就无法售票了,网页显示系统正在维护中,其实这里我猜是不是也有一个类似守护进程的东西在每天的晚间执行,比如打包一些网络日志,便于系统的正常运行
守护进程的编程规则
1、屏蔽操作有关控制终端操作的信号
For(i=1;i<31;i++)
{
Signal(SIGTTOU,SIG_IGN);
}
2、所有的守护进程是后台运行,fork出子进程,父进程退出
If(pid == fork())
{
Exit(0);
}
3、脱离控制终端和进程组
Setsid( ) ;
会话组:每一个登录进入linux系统的用户就形成了一个会话组
4、禁止进程重新打开控制终端
If(pid == fork())
{
Exit(0);
}
5、关闭所有(打开的)文件描述符
#define NOFILE 256
Int I;
for(i=0;i<NOFILE;i++)
{
Close(i);
}
6、改变当前的工作目录
Chdir()修改当前的目录 chdir(“/tmp“);
7、把文件掩码清除
Umask(0) ;
8、自动回收子进程
Signal(SIGHLD , SIG_IGN);
9、进入守护进程的主处理流程
For(;;)
{
//todo
}
注意:
守护进程的代码实现,因为没有了标准输出和标准输入或者perror,所以是没有办法通过终端显示的
为了显示守护进程,方法如下:采用系统日志处理守护进程的输出信息(syslog )
Dmesg 命令输出守护进程的系统日志信息
Cat /var/log/syslog
/var/log/syslog可以查看系统日志信息
自己直接创建文件,存储相关的日志信息
后记:
有关守护进程的理解和掌握,估计此篇还是不能一言以蔽之,不像一个hello world 程序那样打印输出,所见即所得,消息明显,但是在大型linux服务器中,应该会用到了该进程,
总结上述内容,有如下几点:
1、什么是守护进程?(面试很有可能这样问的啊)
我是这样理解的,一般进程都是在会话组或者终端进行的,一个用户登录了就创建了一个会话组,关闭了终端,所有的进程就关闭了,不信可以试试看
那么守护进程就是脱离会话组,以及能够对自己的生死存亡起决定作用的父进程,自由运行(不一定准确哈)
3、 守护进程的特征
守护进程的存在性,比如说要脱离终端,当终端关闭后仍然可以运行,或者脱离父进程,如下代码:
If(pid == fork())
{
Exit(0);
}
上诉代码作用: 关闭父进程,这样子进程就自由了,
一般一个进程是这样开始的,当开启linux的终端并运行一个程序时,shell首先创建一个子进程,并调用exec()函数去执行这个a.out程序,所以其实每一个执行的程序都有自己的爸爸,而守护进程就是要抛弃这个爸爸,独立。
4、 守护进程的一般编程规则
这个没啥好说的,照规矩做就可以了