[linux]进程(六)——守护进程

摘要:
15.守护进程的概念:守护进程是一个在后台运行的特殊进程。守护程序的特性:守护程序在运行之前必须与其环境隔离。setsid()调用成功后,流程将成为新的会话负责人和新的流程组负责人,并与原始登录会话和流程组分离。禁止进程重新打开控制终端。现在,该过程已成为没有终端的会话领导者。它可以修改守护进程创建的文件的访问位。Resolucelimit的大小可以直接影响流程的执行。

15,守护进程

概念:
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程的特点:
守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件
创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。
守护进程的编程要点:
(1)后台运行
 方法是父进程fork()出子进程后,父进程九退出
 if(pid=fork()) 
 exit(0);//是父进程,结束父进程,子进程继续 
(2)脱离控制终端,登录会话和进程组 
 方法是调用setsid(); 
 说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话
 组长和新的进程组长,并与原来的登录会话和进程组脱离。
(3)禁止进程重新打开控制终端
 现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
 if(pid=fork()) 
 exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)
(4)关闭打开的文件描述符
 for(i=0;i 关闭打开的文件描述符close(i);> 
(5)改变当前目录
 进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,
 写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/") 
(6)重设文件创建掩模 
 进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);
(7)处理SIGCHLD信号 
 signal(SIGCHLD,SIG_IGN);

  1. 守护进程实例:  
  2. #include <unistd.h>   
  3. #include <signal.h>   
  4. #include <sys/types.h>   
  5. #include <sys/stat.h>   
  6. #include <stdio.h>   
  7. #include <stdlib.h>  
  8.   
  9. #ifndef NOFILE   
  10. #define NOFILE 3   
  11. #endif  
  12.   
  13. void init_daemon()   
  14. {   
  15.     int pid;   
  16.     int i;   
  17.     if(pid = fork()) exit(0); //父进程,退出   
  18.     else if(pid < 0) exit(1); //fork失败   
  19.     /* 子进程继续执行 */   
  20.     setsid(); //创建新的会话组,子进程成为组长,并与控制终端分离   
  21.     /* 防止子进程(组长)获取控制终端 */   
  22.     if(pid = fork()) exit(0); //父进程,退出   
  23.     else if(pid < 0) exit(1); //fork错误,退出   
  24.     /* 第二子进程继续执行 , 第二子进程不再是会会话组组长*/   
  25.     //for(i = 0; i < NOFILE; i++) /* 关闭打开的文件描述符*/   
  26.     //{   
  27.          //close(i);   
  28.     //}   
  29.     chdir("/tmp"); /* 切换工作目录 */   
  30.     umask(0); /* 重设文件创建掩码 */   
  31.     return;   
  32. }   
  33.   
  34. int main()   
  35. {   
  36.     FILE *fp;   
  37.     signal(SIGCHLD, SIG_IGN); /* 忽略子进程结束信号,防止出现僵尸进程 */   
  38.     init_daemon();   
  39.     while(1)   
  40.     {   
  41.         sleep(1);  
  42.         if((fp = fopen("/home/mantou/test.log", "a")) != NULL)   
  43.         {   
  44.             fprintf(fp, "%s ", "test message");   
  45.             fclose(fp);   
  46.         }   
  47.     }   
  48.     return 0;   
  49. }  


补充:
(1)关于进程 struct rlimit结构体点击打开链接
在Linux系统中,Resouce limit指在一个进程的执行过程中,它所能得到的资源的限制,比如进程的core file的最大值,虚拟内存的最大值等。
Resouce limit的大小可以直接影响进程的执行状况。其有两个最重要的概念:soft limit 和 hard limit。
struct rlimit {
 rlim_t rlim_cur;
 rlim_t rlim_max;
};
(2)守护进程如何打印log
答:可以利用syslog()函数
(3)linux kernel启动用户空间init守护进程的代码
kernel/init/main.c    点击打开链接
目前我们至少知道在内核空间执行用户空间的一段应用程序有两种方法:
1. call_usermodehelper
2. kernel_execve

免责声明:文章转载自《[linux]进程(六)——守护进程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Maven环境变量配置(转)celery定时任务下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安装Linux应用软件的五种基本方法

要充分发挥电脑的作用,就得有大量的应用软件,完成不同的工作。在Windows环境中安装各种应用软件的思路与方法,想必大家早已熟悉。然而,在使用Linux时,我们却总会被这些本不应该是问题的问题所困扰:怎么安装应用软件?我的软件安装在什么地方?如何删除不要的应用软件?……   下面,我们就一起来认识一下这些方面的知识。 一、解析Linux应用软件安装包...

shell命令之---Linux服务器性能查看命令

  一个基于 Linux 操作系统的服务器运行的同时,也会表征出各种各样参数信息。通常来说运维人员、系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十分重要,尤其当你的程序非正常工作的时候,这些蛛丝马迹往往会帮助快速定位跟踪问题。   这里只是一些简单的工具查看系统的相关参数,当然很多工具也是通过分析加工 /proc、/sys 下的数据来工作...

linux下zookeeper的安装教程

zookeeper有单机、伪集群、集群三种部署方式,可根据自己对可靠性的需求选择合适的部署方式。下边对这三种部署方式逐一进行讲解。 注意安装之前必须确认主机已安装jdk,zookeeper的运行依赖java运行环境。 单机: 下载链接:http://archive.apache.org/dist/zookeeper/ 1、 准备好zookeeper安装包,...

Ubuntu Linux启用root用户登录

Ubuntu Linux有一个与众不同的特点,那就是初次使用时,你无法作为root来登录系统,为什么会这样?这就要从系统的安装说起。对于其他Linux系统来 说,一般在安装过程就设定root密码,这样用户就能用它登录root帐户或使用su命令转换到超级用户身份。与之相反,Ubuntu默认安装时,并没有 给root用户设置口令,也没有启用root帐户。问题是...

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库

linux下的静态库创建与查看,及如何查看某个可执行依赖于哪些动态库   创建静态库:ar -rcs test.a *.o查看静态库:ar -tv test.a解压静态库:ar -x test.a查看程序依赖的动态库:readelf -a xxx|grep library如:可以看到,下面的交叉程序hello执行依赖于如下两个动态库。rebi@u...

linux时间同步ntp服务的安装与配置

当我们需要管理多台服务器的时间时,一台一台的修改未免太麻烦了,NTP服务就很好的为我们解决了这个问题! 1.首先安装NTP [root@localhost /]# yum install ntp -y 2.修改NTP配置文件,添加NTP服务器的网络位置    /etc/ntp.conf   # For more information about thi...