守护进程

  守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的。

守护进程的特点

  由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。

  守护进程的概念类似于我们手机后台运行的程序,我们看不见它,它却一直在运行。在Windows系统下也有很多服务,都是所谓的守护进程。

服务器与守护进程

  Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。

  正因为服务器的特点,守护进程在服务器开发上就很重要。

守护进程的创建和使用

  守护进程的创建主要分为以下几个部分:

  • 创建子进程,父进程退出
  • 在子进程中创建新会话
  • 改变当前目录为根目录
  • 重设文件权限掩码
  • 关闭文件描述符
  • 守护进程的退出

1.创建子进程,父进程退出

  由于守护进程是脱离控制终端的,因此会在Shell终端里造成一程序已经运行完毕的假象,也就是后台运行。在Linux中父进程先于子进程退出会造成子进程成为孤儿进程,而每当系统发现一个孤儿进程时,就会自动由1号进程(init)收养它,这样,原先的子进程就会变成init进程的子进程。

  1. if(pid=fork())
  2. exit(); //是父进程,结束父进程 

2.在子进程中创建新会话

  由于调用了fork函数时,子进程全盘拷贝了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,这还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱其他进程的控制。 

setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid有下面的3个作用:
  1. 让进程摆脱原会话的控制
  2. 让进程摆脱原进程组的控制
  3. 让进程摆脱原控制终端的控制

  其中,会话是一个或多个进程组的集合。通常,一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。

  1. setsid(); //第一子进程成为新的会话组长和进程组长

3.改变当前目录为根目录

  使用fork创建的子进程继承了父进程的当前工作目录。

  1. chdir("/"); //改变工作目录到/

4.重设文件权限掩码

  由于使用fork函数新建的子进程继承了父进程的文件权限掩码,它可能修改守护进程所创建程序的存取位。

  所以需要把文件权限掩码设置为0,可以大大增强该守护进程的灵活性。

  1. umask(); //重设文件创建掩模

5.关闭文件描述符

  用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。

  1. for(i=;i<MAXFILE;i++) //关闭打开的文件
  2. close(i);

6.守护进程退出

  当用户需要外部停止守护进程运行时,往往会使用 kill命令停止该守护进程。所以,守护进程中需要编码来实现kill发出的signal信号处理,达到进程的正常退出。

  1. signal(SIGCHLD,SIG_IGN);

例子

  1. //daemon.c
    #include <unistd.h>
  2. #include <signal.h>
  3. #include <sys/param.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6.  
  7. void init_daemon(void)
  8. {
  9. int pid;
  10. int i;
  11. if(pid=fork())
  12. exit(); //是父进程,结束父进程
  13. else if(pid< )
  14. return();
  15. setsid(); //第一子进程成为新的会话组长和进程组长
  16.  
  17. //并与控制终端分离
  18. if(pid=fork())
  19. exit(); //是第一子进程,结束第一子进程
  20. else if(pid< )
  21. exit();
  22.  
  23. //是第二子进程,继续
  24. //第二子进程不再是会话组长
  25. for(i=;i< NOFILE;++i) //关闭打开的文件描述符
  26. close(i);
  27.  
  28. chdir("/"); //改变工作目录到/
  29. umask(); //重设文件创建掩模
  30. return;
  31. }
  1. //test.c
    #include <stdio.h>
  2. #include <time.h >
  3.  
  4. void init_daemon(void);//守护进程初始化函数
  5.  
  6. main()
  7. {
  8. init_daemon();//初始化为Daemon
  9.  
  10. while(){
  11. sleep(时间);
  12. 处理函数... ;
  13. }
  14. }

  注意,想要关闭后台程序,可以使用"Kill 进程标识符"的命令,查看进程状态可以使用ps -ef。

参考

http://baike.baidu.com/view/53123.htm

http://blog.csdn.net/zg_hover/article/details/2553321


Server Develop (七) Linux 守护进程 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

Server Develop (七) Linux 守护进程的更多相关文章

  1. [转]❲阮一峰❳Linux 守护进程的启动方法

    ❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...

  2. Linux守护进程详解(init.d和xinetd) [转]

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台 的守护进程来执行的 ...

  3. Linux守护进程详解(init.d和xinetd)

    一 Linux守护进程 Linux 服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程来执行的. ...

  4. Linux守护进程的编程实现

    Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...

  5. CentOS 7.4 初次手记:第一章 Linux守护进程(daemon)

    第一节 init & sysvinit 6 I sysvinit 运行顺序... 6 II Sysvinit和系统关闭... 7 III Sysvinit 的小结... 7 IV 运行级别.. ...

  6. Linux守护进程简单介绍和实例具体解释

    Linux守护进程简单介绍和实例具体解释 简单介绍 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程. ...

  7. Linux守护进程及Systemd

    当我们启动一个前台任务后,命令行窗口退出,应用也就一起退出,无法访问了.怎么才能让它变成系统的守护进程(daemon),成为一种服务(service),一直在那里运行呢? 守护进程 前台任务和后台任务 ...

  8. .NET跨平台实践:用C#开发Linux守护进程

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

  9. .NET跨平台实践:用C#开发Linux守护进程(转)

    Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...

随机推荐

  1. Jmeter之逻辑控制器(Logic Controller)

    Jmeter之逻辑控制器(Logic Controller) 前言: 1. Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in w ...

  2. eclipse中导入项目后中文成乱码解决办法

    转自:http://blog.163.com/lang_zi_ming/blog/static/1140161762010412112650774/ 编程时在往eclipse中导入项目后 项目中的中文 ...

  3. CSS声明顺序

    CSS对元素样式进行声明,虽然一条规则中的声明可以按照任何顺序写出来,但是还是应该有个优先级的顺序. 如下的声明顺序摘抄自<CSS设计指南>,优先级顺序如下: display及相关声明 p ...

  4. PHP基本问题

    WampServer修改端口及菜单Localhost http://www.wuwenhui.cn/3047.html WAMPServer默认配置更改-web根目录 http://blog.csdn ...

  5. 添加和删除hadoop集群中的节点

    参见 http://www.cnblogs.com/tommyli/p/3418273.html

  6. java文件乱码

    要让一个 Java 源文件打开时编码格式为 UTF-8,需要做2件事情:1)设置Java 源文件的默认编码格式为UTF-8:2)设置workspace的编码格式为UTF-8. 相应设置如下: 设置 J ...

  7. css 层的嵌套

    html <div class="menu"> <ul> <li><a class="li1" title=" ...

  8. centos6.5搭建lnmp环境

    注:本文原文链接:http://www.cnblogs.com/xiaoit/p/3991037.html 本文只是做保存使用 1:查看环境: [root@10-4-14-168 html]# cat ...

  9. linux中压缩与解压缩命令

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压 ...

  10. mfc中CString转化为string的方法

    LL(1)分析法实验的mfc做到最后因为CString转化为string的问题卡了一个多小时,也是惨,网上各种方法找过都不行.幸亏最后还是找到几行代码搞定了.特此mark一下. USES_CONVER ...