您的位置:首页 > 运维架构 > Linux

Linux守护进程分析(不断补充过程中……)

2014-01-05 16:24 288 查看
守护进程(Daemon)是运行在后台的特殊进程。并不会接受电脑用户的直接操控。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。Linux的大多数服务器就是用守护进程实现的,此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。

通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。这种方法通常被称为“脱壳”

守护进程及其特性:

守护进程最重要的特性是后台运行。
守护进程必须与其运行前的环境隔离开来。这些环境包括:未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。
守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。

除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。

示例分析:

#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <time.h>
void init_daemon(void)
{
int pid;
int i;
/*脱离控制终端*/
if( pid=fork() )
exit(0);//结束父进程
else if(pid< 0)
exit(1);
setsid();//第一子进程成为新的会话组长和进程组长
/*与控制终端分离,通过使进程不再成为会话组长来禁止进程重新打开控制终端*/
if(pid=fork())
exit(0);
else if(pid< 0)
exit(1);
for(i=0;i< NOFILE;++i)//关闭打开的文件描述符
close(i);
chdir("/home/tmp");//改变工作目录到/tmp
umask(0);//重设文件创建掩模
return;
}
main()
{
FILE *fp;
time_t t;
init_daemon();//初始化为Daemon
while(1)//每隔一分钟向test.log报告运行状态
{
sleep(60);//睡眠一分钟
if((fp=fopen("test.log","a")) >=0)
{
t=time(0);
fprintf(fp,"Im here at %s\n",asctime(localtime(&t)) );
fclose(fp);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: