1 什么是守护进程

1.守护进程:在后台运行,且不受终端控制的一种进程。
2.通过ps axj | more指令可以查看到Linux下的守护进程

[root@localhost 进程组]# ps axj | more
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND0     1     1     1 ?           -1 Ss       0   0:03 /sbin/init0     2     0     0 ?           -1 S        0   0:00 [kthreadd]2     3     0     0 ?           -1 S        0   0:00 [migration/0]2     4     0     0 ?           -1 S        0   0:02 [ksoftirqd/0]2     5     0     0 ?           -1 S        0   0:00 [stopper/0]2     6     0     0 ?           -1 S        0   0:41 [watchdog/0]2     7     0     0 ?           -1 S        0   0:37 [events/0]2     8     0     0 ?           -1 S        0   0:00 [events/0]2     9     0     0 ?           -1 S        0   0:00 [events_long/0]2    10     0     0 ?           -1 S        0   0:00 [events_power_ef]2    11     0     0 ?           -1 S        0   0:00 [cgroup]2    12     0     0 ?           -1 S        0   0:00 [khelper]

可以看到:守护进程的TPGID为-1,也就是TPGID为-1的为守护进程

2 创建守护进程的流程

1.创建子进程,终止父进程

因为守护进程脱离终端的控制,一方面因为让父进程退出,就会使得当前终端可以执行其它的指令,而之后其它的操作都让子进程去执行,让子进程已一种僵尸状态来执行,就可以达到脱离终端的目的。另一方面,需要创建新的会话,而创建会话的进程不能是组长进程,让父进程创建一个子进程,那么子进程一定不是组长进程。

2.子进程创建会话

因为子进程继承了父进程的一些信息,包括会话相关的消息,子进程必须要脱离父进程所在的会话,必须创建新的会话,让子进程变为新会话的话首进程

3.屏蔽SIGCHLD信号

为了防止僵尸进程的出现

4.改变当前工作目录

因为子进程以父进程为模板,那么子进程就会和父进程处在同一个工作目录下,所以需要改变子进程的工作目录

5.重定向文件描述符

因为子进程是以父进程为模板,那么子进程就有和父进程一样的文件描述符表,父进程打开的文件,子进程也能操作,所以需要将文件描述符重定向,重定向至”/dev/null/”,这个目录相当于一个垃圾桶

6.重建文件创建掩码umask

因为创建文件时,文件创建掩码会屏蔽掉一些权限对应的位,所以需要重建文件创建掩码

3 相关代码

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>void MyDaemon()
{//7.屏蔽umaskumask(0);//1.创建一个子进程pid_t pid = fork();if(pid < 0){perror("fork");}else if(pid > 0){//2.让父进程退出exit(0);}//3.子进程调用setsid,创建一个新的会话,pid_t ret = setsid();if(ret < 0){perror("setsid");}//4.忽略掉SIGCHLD信号,忽略SIGHUP信号signal(SIGCHLD,SIG_IGN);signal(SIGHUP,SIG_IGN);//5.修改工作目录为“/”  if(chdir("/") < 0){perror("chdir");}//6.重定向文件描述符int fd = open("/dev/null",O_RDWR);                                                                                                  dup2(fd,0);dup2(fd,1);}int main()
{MyDaemon();   //调用该函数之后就会使得main进程变为守护进程while(1){sleep(1);}return 0;
}      

​运行结果:(可以看到当前进程mydaemon的TPGID为-1,说明为守护进程)

[root@localhost 进程组]# ps axj | head -n 1 && ps axj | grep mydaemon | grep -v  grep
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 28482 28482 28482 ?           -1 Ss       0   0:00 ./mydaemon

4 创建守护进程的另外两种方法

1.通过daemon函数
(1)相关参数

#include <unistd.h>
int daemon(int nochdir, int noclose);//nochdir为0表示将工作目录变为"/"
//noclose为0表示将文件描述符重定向至"/dev/null"

(2)代码:

#include <stdio.h>
#include <unistd.h>int main()
{daemon(0,0);                                                                                                                        while(1){   sleep(1);}   return 0;
}

(3)运行结果:(可以看到进程mydaemon2变为守护进程)

[root@localhost 进程组]# ps axj |head -n 1 && ps axj | grep mydaemon2 | grep -v grep
PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND1 29063 29063 29063 ?           -1 Ss       0   0:00 ./mydaemon2

2.通过nohup指令(该指令与编程语言无关,适用任意一种语言)
(1)nohup 后面加上进程名 再加上&
(2)使用:

  • 例如对于下面进程:
#include <stdio.h>
#include <unistd.h>int main()
{int i = 0;for(;i<10;++i){   printf("%d\n",i);sleep(1);}   return 0;
}

将其变为守护进程:

[root@localhost 进程组]# nohup ./mydaemon3 &
[2] 29367

此时会在当前目录下生成一个nohup.out文件,但是显示下面这句话,表示权限不够,也就是没有可执行权限

[root@localhost 进程组]# nohup: ignoring input and appending output to `nohup.out'

​通过chmod +x可以给某个文件加上可执行权限,此时运行结果如下:(可以看到mydaemon3进程的运行结果显示在nohup.out文件里)

[root@localhost 进程组]# chmod +x nohup.out
[2]+  Done                    nohup ./mydaemon3
[root@localhost 进程组]# cat nohup.out
0
1
2
3
4
5
6
7
8
9

Linux--守护进程相关推荐

  1. Linux守护进程实现

    Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...

  2. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  3. .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计

    几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...

  4. .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇

    Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...

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

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

  6. 深入理解Linux守护进程

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

  7. Linux守护进程的创建(结合nginx框架)

    Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...

  8. linux+守护进程+php,【转载】Linux 守护进程的编程方法

    [转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...

  9. linux 守护进程_网络工程师之linux守护进程

    Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...

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

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

最新文章

  1. Oracle配置OneMap中的sql数据库问题及解决方案
  2. 最优子结构(Optimal Substructure)
  3. Spring MVC:使用SimpleUrlHandlerMapping的一个简单例子
  4. 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
  5. 基于modbus协议的工业自动化网络规范_一种基于Modbus的工业通信网关设计
  6. 计算机考研调剂学校2019有哪些,2019考研调剂:最全的调剂攻略千万别错过!
  7. 如何自己实现一个缓存服务
  8. C# pdf转jpg文件
  9. Ubuntu20.04 安装matlab2017b
  10. java毕业设计易医就医购药交互平台Mybatis+系统+数据库+调试部署
  11. hp服务器经常自动重启,惠普电脑经常自动重启的解决方法
  12. 直线分割平面的公式_直线分割平面-jiangwen127-ChinaUnix博客
  13. springboot 集成quartz带数据库持久化
  14. 计算机组成原理A原是什么,计算机组成原理(A).doc
  15. 113.库存明细账案例(包含结存数)
  16. 基于51单片机的汽车自动照明灯超声波光敏检测远近光灯方案原理图设计
  17. 连接到系统上的设备没有发挥作用解决方案
  18. Android开发之UI线程和非UI线程
  19. pintia计算机课程考试多选题,大学计算机基础与应用2(理)-中国大学mooc-题库零氪...
  20. 某页式虚拟存储器,若某用户空间为16个界面,页面大小为1KB,现有页表如下,逻辑地址0A2CH所对应的物理地址为

热门文章

  1. lol游戏官网html模板,imageLolder
  2. 无法解压文件请重新启动计算机,解压文件是弹出来说4G以上的文件无法解压是怎么回事...
  3. 从 HTTP 协议求解:为什么我们越来越不需要雪碧图了?
  4. 使用chatgpt一分钟帮你实现思维导图
  5. 怎样做到参加会议“到有所获”?
  6. @程序员,终于可以放心写bug了!Facebook的debug神器你值得拥有
  7. 中国统计年鉴2018
  8. 安卓系统管理软件_安卓用户,你的微信又要变了
  9. 汽车零件产品开发过程A样件、B样件和C样件的区别?
  10. 数据处理中白化Whitening的作用图解分析