守护进程(daemon)是指在后台运行的,没有控制终端与之相连的进程。它独立于控制终端,通常周期性的执行某种任务。

守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程的方式实现的,如Internet服务器进程inetd,Web服务器进程http等。守护进程在后台

运行,类似于windows中的系统服务。

守护进程的启动方式:

1、系统启动时从启动脚本/etc/rc.d中启动

2、作业规划进程crond启动

3、用户终端(shell)执行

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

创建守护进程的步骤:

1、fork产生一个子进程,让父进程退出

2、调用setsid创建一个新会话。控制终端,登陆会话和进程组通常是从父进程继承下来的。

守护进程要摆脱他们,不受他们的影响,其方法是调用setsid使进程成为一个会话组长

注意:当进程是会话组长时,调用setsid会失败,当时第一点保证了进程不是会话组长。setsid调用成功后,进程成为新的会话组长和进程组长,

并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

3、禁止进程重新打开控制终端。以上步骤,进程已经成为一个无终端的会话组长,但是他可以重新申请打开一个终端。为了避免这种情况的发生,可以通过使进程不再是会话

组长来实现。再一次通过fork创建一个新的子进程,使调用fork的进程退出。

4、关闭不在需要的文件描述符。创建的子进程从父进程继承打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及无法预料的错误。

先得到最高的文件描述符,然后用一个循环过程,关闭0到最高文件描述符值的所有文件描述符。

5、将当前目录更改为根目录,当守护进程当前工作目录在一个装配文件系统时,该文件系统不能被拆卸。一般需要将工作目录改为根目录。

6、将文件创建时使用的屏蔽字设置为0,进程从创建他的父进程那里继承的文件创建屏蔽字可能会拒绝某些许可权。为防止这一点,使用umask(0)将屏蔽字清零。

7、处理SIGCHLD信号。这一步不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将会成为僵尸进程,从而占用系统资源。如果父进程等待子进程结束,

将增加父进程的负担,影响服务器进程的并发性。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。这样,子进程结束时不会产生僵尸进程。

  1. #include <time.h>
  2. #include <syslog.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <sys/param.h>
  9.  
  10. int init_daemon()
  11. {
  12. int pid;
  13. int i;
  14.  
  15. /*忽略终端I/O信号,STOP信号*/
  16. signal(SIGTTOU, SIG_IGN);
  17. signal(SIGTTIN, SIG_IGN);
  18. signal(SIGTSTP, SIG_IGN);
  19. signal(SIGHUP, SIG_IGN);
  20.  
  21. /创建子进程/
  22. pid = fork();
  23. if(pid > )
  24. {
  25. //父进程退出,使得子进程成为后台进程
  26. exit();
  27. }
  28. else if(pid < )
  29. {
  30. return -;
  31. }
  32.  
  33. //建立一个新的进程组,在这个新的进程组中,子进程成为这个进程组的首进程,以使该进程脱离所有终端
  34. setsid();
  35.  
  36. //再次新建一个子进程,退出父进程,保证该进程不是进程组长,同时让该进程无法再打开一个新的终端
  37. pid = fork();
  38. if(pid > )
  39. {
  40. exit();
  41. }
  42. else if(pid < )
  43. {
  44. return -;
  45. }
  46.  
  47. //关闭所有从父进程继承的不再需要的文件描述符
  48. for(i=;i<NOFILE;close(i++));
  49.  
  50. //改变工作目录,使得进程不与任何文件系统联系
  51. chdir("/");
  52.  
  53. //将文件屏蔽字设置为0
  54. umask();
  55.  
  56. //忽略SIGCHLD信号
  57. signal(SIGCHLD, SIG_IGN);
  58.  
  59. return ;
  60.  
  61. }
  62.  
  63. int main()
  64. {
  65. time_t now;
  66.  
  67. init_daemon();
  68.  
  69. syslog(LOG_USER|LOG_INFO, "test daemon\n");
  70.  
  71. while()
  72. {
  73. sleep();
  74. time(&now);
  75. syslog(LOG_USER|LOG_INFO, "system time: %s", ctime(&now));
  76. }
  77.  
  78. }

系统ubuntu

注意使用syslog之前,需要先进行配置修改文件   /etc/rsyslog.d/50-default.conf

放开   user.* -/var/log/user.log   这行的注释。

重新启动rsyslog服务 切换到目录/etc/init.d

执行:

/etc/init.d# ./rsyslog stop

/etc/init.d# ./rsyslog start

关于syslog的配置:

http://blog.csdn.net/shi1122/article/details/8626629

守护进程的创建(syslog函数)的更多相关文章

  1. Linux系统编程之--守护进程的创建和详解【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...

  2. linux下守护进程的创建

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

  3. twemproxy源码分析2——守护进程的创建

    twemproxy源码中关于守护进程的创建实现得比较标准,先贴出代码来,然后结合一些资料来分析和列举一些实现守护进程的常用方法,不过不得不说twemproxy的实现确实是不错的,注释都写在了代码中,直 ...

  4. 写守护进程时碰到open函数的参数,没记住

    今天写一个最简单的守护进程, 要成为一个守护进程,其实很简单了.主要步骤就4步: 1,创建进程. 2,父进程退出. 3,成为会话的头领进程. 4,将工作目录改成根目录,并把标准输入输出重定向到空设备. ...

  5. Unix网络编程代码 第13章 守护进程和inetd超级服务器

    1. 概述 守护进程是在后台运行且不与任何控制终端关联的进程.unix系统通常有很多守护进程在后台运行,执行不同的管理任务.    守护进程没有控制终端通常源于它们由系统初始化脚本启动.然而守护进程也 ...

  6. APUE读书笔记-第13章-守护进程

    第13章 守护进程 13.1 引言 *守护进程也称精灵进程(daemon)是生存期较长的一种进程.它们常常在系统自举时启动,仅在系统关闭时才终止.因为它们没有控制终端,所以说它们是在后台运行的.UNI ...

  7. apue学习笔记(第十三章 守护进程)

    本章将说明守护进程结构,以及如何编写守护进程程序. 守护进程,也就是通常说的Daemon进程,是Unix中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理 ...

  8. 《Unix环境高级编程》读书笔记 第13章-守护进程

    1. 引言 守护进程是生存期长的一种进程.它们常常在系统引导装入时启动,仅在系统关闭时才终止.它们没有控制终端,在后台运行. 本章说明守护进程结构.如何编写守护进程程序.守护进程如何报告出错情况. 2 ...

  9. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

随机推荐

  1. keepalived+nginx实现HA高可用的web负载均衡

    Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用.Keepalived ...

  2. 20145310《网络对抗》Exp9 Web安全基础实践

    基础问题回答 SQL注入攻击原理,如何防御? SQL注入攻击就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,通过执行SQL语句进执行攻击者所要的操作. 如何防御?首先严格区分 ...

  3. JS中的按位非(~)的使用技巧

    按位非 按位非操作符由一个波浪线(~)表示,执行按位非的结果就是返回数值的反码 现在让我来看几个例子 例子1 console.log(4); console.log(~4); console.log( ...

  4. 【集群搭建】Zookeeper集群环境配置

    1.下载解压安装文件 2.配置文件:conf/zoo.cfg tickTime=2000 dataDir=/usr/sunny/logs/zookeeper/data dataLogDir=/usr/ ...

  5. HDU 6121 Build a tree(完全K叉树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:给你一颗完全K叉树,求出每棵子树的节点个数的异或和. 思路: 首先需要了解一些关于完全K叉树或满K叉 ...

  6. BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...

  7. UVa 10905 孩子们的游戏

    https://vjudge.net/problem/UVA-10905 题意: 给定n个正整数,把它们连接成一个最大的整数. 思路: 实在是没想到直接用string来排序了. #include< ...

  8. UVa 11134 传说中的车

    https://vjudge.net/problem/UVA-11134 题意:在n*n的棋盘上放n个车,使得任意两个车不相互攻击,且第i个车在一个给定的矩形Ri之内.用4个整数xli,yli,xri ...

  9. UVa 818 切断圆环链(dfs+二进制枚举)

    https://vjudge.net/problem/UVA-818 题意:有n个圆环,其中有一些已经扣在了一起.现在需要打开尽量少的圆环,使得所有圆环可以组成一条链,例如,有5个圆环,1-2,2-3 ...

  10. django路由转发

    一.路由转发 通常,我们会在每个app里,各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的urls.py模块中. 例如,下面是Django网站本身的UR ...