什么是守护进程?
    守护进程就是通常所说的Daemon进程,它是Linux中的后台服务程序。

它是一个生存期较长的进程,通常独立于终端而且周期性的运行某种须要的任务以及有时候会等待一些将会发生的事情。守护进程经常会在系统启动的时候開始运行,在系统关闭的时候关闭,它实现了linux系统中的非常多系统级的服务。

    还有一方面Daemon不受终端的影响,不会由于某个终端的关闭而关闭。所以,假设你希望你的进程不会由于用户或者终端的变化而变化。那么你就必需要知道怎么把你的进程设置为守护进程(也就是所说的Daemon进程了)。

编写守护进程事实上没有看似那么的复杂,就是完毕下面五步骤就可以创建出一个Daemon进程,
创建守护进程的5个步骤:

(1)创建子进程,父进程退出  。

这一步就是要在外表看来让子进程与终端脱离。这个时候原先的子进程就会变为孤儿进程,那么孤儿进程就会被init进程进行收养了。


(2)在子进程中创建的新会话setsid() : 调用者不能是组长进程],这一步是创建守护进程最重要的一步了,尽管实现很大的简单。可是意义很的重大。

先介绍下setsid()函数的作用:

    setsid()函数用于创建一个新的会话,并担任该会话组的组长,调用setsid()有以下3个作用:
    (1)让进程拜托原会话的控制
    (2)让进程拜托原进程组的控制
    (3)让进程拜托原控制终端的控制
    那么接下来我们就会非常清楚的知道我们为什么要去运行setsid()函数了,由于在第一步我们创建进程的时候。子进程全盘复制了父进程的会话期,进程组,和控制终端等。

尽管父进程退出了。但原先的会话期。进程组和控制终端没有变。因此还不是真正意义上的独立了。而setsid()函数可以让进程全然的独立出来,从而脱离全部其他进程的控制哦。


(3)改变进程的工作文件夹到"/" ; 改变工作文件夹的函数时chdir();

(4)重设文件掩码,通常使用的方法是 umask(0) ; 文件权限掩码(通经常使用8进制表示)的作用是屏蔽文件权限中的相应位。 

(5)关闭不须要的文件描写叙述符号 。通常关闭的是[0,1,2,3]   
    同文件权限掩码一样。用fork()函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程訪问。但它们一样占用系统资源,并且还可能导致所在的文件系统无法被卸载。

特别是守护进程和终端无关,所以指向终端设备的标准输入,标准输出和标准错误流,已经失去了存在的价值。应当被关闭。通常的做法例如以下:

        int  num;
        num  =  getdtablesize(); //获取当前进程文件描写叙述符表的大小
        for(i = 0;i < num ;i++)
        {    
            close( i );
        }


    经过上述的五大步骤。一个简单的守护进程就建立起来了。

大致的流程见下图:

 

好了。大致的思想了解之后,接下来的事情就简单的多了,无非就是代码的实现的问题了;

以下以守护进程为出发点列举一个样例,希望能够具体的了解下,看看守护进程是怎样实现时间日志的



#include <head.h>

#define daemo_mode 0
#define nomal_mode 1 int daemo() //5步创建守护进程
{
pid_t pid;
pid = fork();
if(pid < 0)
{
fprintf(stderr,"File to fork\n",strerror(errno));
exit(EXIT_FAILURE);
}
if(pid > 0)
exit(EXIT_FAILURE); if(setsid() < 0)
{
perror("File to setsid");
exit(EXIT_FAILURE);
}
chdir("/");
umask(0);
close(0);
close(1);
close(2);
return 0;
} int get_line(FILE *fp)
{
int line;
char *tmp;
char buf[4096];
while(1)
{
tmp = fgets(buf,sizeof(buf),fp);
if(tmp == NULL)
break;
if(buf[strlen(tmp) - 1] == '\n')
line++;
}
return line;
} int do_nomal(const char *filename)
{
FILE * fp;
time_t t;
struct tm *ptm;
int line = 0; fp = fopen(filename,"a+"); if(fp == NULL)
{
fprintf(stderr,"File to fopen\n",strerror(errno));
exit(EXIT_FAILURE);
} line = get_line(fp); while(1)
{
++line;
time(&t); //The realization of time
ptm = localtime(&t); sleep(1);
fflush(fp);
fprintf(fp,"%d-%d-%d",(1900+ptm->tm_year),(1+ptm->tm_mon),ptm->tm_mday);
fprintf(fp,"%d:%d:%d\n",ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
}
return 0;
}
// ./a.out log 0/1
int main(int argc, const char *argv[])
{
if(argc < 3)
{
fprintf(stderr,"Usage : %s argv[1] argv[2]\n",argv[0]);
exit(EXIT_FAILURE);
}
int mode = atoi(argv[2]);
switch(mode)
{
case daemo_mode:
daemo();
break;
case nomal_mode:
break;
default:
printf("Unknow mode \n");
goto next;
}
do_nomal(argv[1]); next:
return 0;
}



Linux下守护进程精析的更多相关文章

  1. linux下守护进程的创建

    最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <std ...

  2. Linux下守护进程初探

    守护进程一直后台运行,与终端脱离,一般负责周期性地执行系统任务,服务器应用一般以守护进程进行运行.实现一个守护进程主要分为5部: 1.脱离父进程 2.setsid(可以选择再次fork) 3.umas ...

  3. linux 创建守护进程的相关知识

    linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关 ...

  4. linux C守护进程编写

    linux编程-守护进程编写 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件.守护进程是一种很有用的进程. Linux的大多数服 ...

  5. asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二)

    原文:asp.net core2.0 部署centos7/linux系统 --守护进程supervisor(二) 续上一篇文章:asp.net core2.0 部署centos7/linux系统 -- ...

  6. 【Linux】- 守护进程的启动方法

    转自:Linux 守护进程的启动方法 Linux中"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问 ...

  7. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  8. linux下对进程按照内存使用情况进行排序

    linux下对进程按照内存使用情况进行排序的命令为:ps aux --sort -rss 详细解说参见 http://alvinalexander.com/linux/unix-linux-proce ...

  9. linux下查看进程占用端口和端口占用进程命令

    Linux下查看进程占用端口: 查看程序对应进程号:ps –ef|grep 进程名 REDHAT :查看进程号所占用的端口号:netstat –nltp|grep 进程号 ubuntu:查看进程占用端 ...

随机推荐

  1. Controller接口控制器

    1.Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: 2.将命令对象交给业务对 ...

  2. P1328 生活大爆炸版石头剪刀布

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  3. 《五》uploadify插件上传文件

    下载地址:http://www.uploadify.com/wp-content/uploads/files/uploadify.zip 相关配置:http://www.uploadify.com/d ...

  4. Django_视图操作

  5. css————获取样式的各种方法

    元素.style.样式:只能获取行间样式,css中的样式不能获取,且获得的内容是字符串. 元素.offsetWidth:可以获取无论css样式还是行间样式,但只能获得width,height,pare ...

  6. Linux学习总结(7)——阿里云centeros服务器上安装 jdk,tomcat,mysql

    查看服务器的系统版本 # cat /etc/issue 查看服务器是64位还是32位 #uname -a      或者用:#getconf LONG_BIT 查看当前有没有安装jdk #rpm -q ...

  7. LoadRunner使用教程

    1.了解Loadrunner 1.1 LoadRunner 组件有哪些? LoadRunner 包含下列组件: ➤ 虚拟用户生成器用于捕获最终用户业务流程和创建自动性能测试脚本(也称为虚拟用户脚本). ...

  8. Linux中 ps aux 命令

    $ ps aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 11 100.0 0.0 0 16 ?? RL 4Dec09 ...

  9. 实验记录三 通用输入输出(GPIO)

    之前把全部程序都跑了一次后,得到了导师下一步的安排. 例如以下: 1.编写一个程序.实如今LCD上显示一个万年历,包含年月日 星期 还有室内的温度.2.编写一个程序,将原来的交通灯改为跑马灯. 期限是 ...

  10. SSH无password登陆配置

    摘录一 在192.168.42.142机器上 1)执行:ssh-keygen -t rsa 2)然后拍两下回车(均选择默认) 3)执行: ssh-copy-id -i /root/.ssh/id_rs ...