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

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);

[cpp] view plaincopy

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

补充:
(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

时间: 2024-08-10 19:17:54

[linux]进程(六)——守护进程的相关文章

Linux进程学习(孤儿进程和守护进程)

孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为 init 进程的子进程.2.那么如何让一个进程变为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程.pid =  fork();if(pid > 0) {         

Linux进程学习 - 孤儿进程和守护进程

孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如果一个子进程的父进程先于子进程 结束, 子进程就成为一个孤儿进程,它由 init 进程收养,成为 init 进程的子进程.2.那么如何让一个进程变为一个孤儿进程呢?我们可以先创建一个进程,然后杀死其父进程,则其就变成了孤儿进程.pid =  fork();if(pid > 0) {         

linux下服务器守护进程的安装

一.在服务器上安装rstatd守护进程安装步骤:1. 从网上下载rstatd2. 将该文件放到/home/user目录下3. chmod 777 rpc.rstatd----改变该文件读写的权限,拥有所有权限.4. chmod 777 configure ---同上5. ./configure ---配置6. make ---编译7. make install ---安装8. rpc.rstatd ---启动rstatd进程二.在lr中配置从LR里面add measurement, 填写linu

Linux环境编程之进程(六):进程组

进程组 每个进程除了有一个进程ID之外,还属于一个进程组.进程组是一个或多个进程的集合.每个进程组有一个唯一的进程组ID.进程组ID类似于进程ID--它是一个整数,并可存放在pid_t数据类型中.函数getpgrp返回调用进程的进程组ID. 每个进程组都可以有一个组长进程.组长进程的标识是,其进程组ID等于其进程ID.组长进程可以创建一个进程组,创建该组中的进程,然后终止.只要在某个进程组中有一个进程存在,则进程组就存在,这与其组长进程是否终止无关.从进程组创建开始到其中最后一个进程离开为止的时

Linux编程实现守护进程

Linux 守护程序 守护进程(Daemon)它是在一个特定的过程的背景进行. 事件.守护进程是一种非常实用的进程. Linux的大多数server就是用守护进程实现的. 比方,Internetserverinetd,Webserverhttpd等. 同一时候,守护进程完毕很多系统任务.比方.作业规划进程crond,打印进程lpd等. 守护进程的编程本身并不复杂,复杂的是各种版本号的Unix的实现机制不尽同样.造成不同Unix环境下守护进程的编程规则并不一致.这须要读者注意,照搬某些书上的规则(

Linux系统编程——特殊进程之守护进程

什么是守护进程? 守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件. 守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示.由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都

linux应用开发-守护进程

linux应用开发-守护进程 linux应用开发-守护进程 一 守护进程 默认的后台运行的进程 二 与安卓的服务相关联 三 守护进程编写 1 脱离控制终端tty,让父进程为init 2 禁止进程重新打开控制终端 3 重新开启会话setsid(); 4 关闭打开的文件描述符,进程从创建它的父进程哪里继承了打开的文件描述符 ,若不关闭,将会造成资源浪费,造成进程所在的文件系统无法卸下以及引起无法预料的错误 可以使用for循环关闭 for (i = 0 ; i < 文件描述符的个数; i++) { c

zombie僵尸进程、孤儿进程和守护进程

以前一直对僵尸进程和孤儿进程都没怎么理解,真是罪过,最近在看liunx编程设计(第四版),看到了他们的概念,所以对它们做个总结!加深印象. 基本概念: 我们知道在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再创建新的进程.子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态. 但是如果情况不是这样的会怎么样呢,毕竟世事难料

python并发编程-进程理论-进程方法-守护进程-互斥锁-01

操作系统发展史(主要的几个阶段) 初始系统 1946年第一台计算机诞生,采用手工操作的方式(用穿孔卡片操作) 同一个房间同一时刻只能运行一个程序,效率极低(操作一两个小时,CPU一两秒可能就运算完了) 联机批处理系统 脱机批处理系统 多道程序系统 1.空间上的复用 ? 多个程序公用一套计算机硬件 2.时间上的复用 ? 切换+保存状态 ? 保存状态:保存当前的运行状态,下次接着该状态继续执行 ? 切换的两种情况 ? (1) 当一个程序遇到 I/O 操作(不需要使用CPU),操作系统会剥夺该程序的C

孤儿进程、僵尸进程和守护进程

维基百科的解释中: 在操作系统领域中,孤儿进程指的是在其父进程执行完成或被终止 后仍继续运行的一类进程. 在类UNIX系统中,僵尸进程是指完成执行(通过 exit 系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个表项(进程控制块PCB),处于"终止状态 "的进程. 在一個多工的電腦作業系統中,守护进程(英语:daemon,英语发音:/?di?m?n/或英语发音:/?de?m?n/)是一種在后台执行的电脑程序. 此类程序会被以进程的形式初始化. 守护进程