Linux--守护进程
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--守护进程相关推荐
- Linux守护进程实现
Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...
- Linux 命令详解(六)Linux 守护进程的启动方法
Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html
- .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
几年前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程.NET跨平台实践:再谈用C#开发Linux守护进程 - 完整篇 这就是本文 ...
- .NET跨平台实践:再谈用C#开发Linux守护进程 — 完整篇
Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展 ...
- .NET跨平台实践:用C#开发Linux守护进程
Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作. 一句话,为L ...
- 深入理解Linux守护进程
深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daem ...
- Linux守护进程的创建(结合nginx框架)
Linux守护进程的创建(结合nginx框架) 先介绍几个相关函数: int dup2(arg1,arg2):参数一指向的内容赋给参数二,shi的参数二也能访问参数一所指向的内容,并返回新的描述符 i ...
- linux+守护进程+php,【转载】Linux 守护进程的编程方法
[转载]Linux 守护进程的编程方法 原文见: http://www.linuxdevelop.org/tingxx/show.php?table=c&id=3 Linux 守护进程的编程方 ...
- linux 守护进程_网络工程师之linux守护进程
Linux守护进程就是通常所说的DEAMON进程,linux后台服务多种多样,每一个服务都运行一个对应的程序,这些后台程序对应的进程就是守护进程.系统中可以看到很多如DHCPD和HTTPD之类的进程, ...
- 【Linux】Linux 守护进程的启动方法
转载:Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 W ...
最新文章
- Oracle配置OneMap中的sql数据库问题及解决方案
- 最优子结构(Optimal Substructure)
- Spring MVC:使用SimpleUrlHandlerMapping的一个简单例子
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
- 基于modbus协议的工业自动化网络规范_一种基于Modbus的工业通信网关设计
- 计算机考研调剂学校2019有哪些,2019考研调剂:最全的调剂攻略千万别错过!
- 如何自己实现一个缓存服务
- C# pdf转jpg文件
- Ubuntu20.04 安装matlab2017b
- java毕业设计易医就医购药交互平台Mybatis+系统+数据库+调试部署
- hp服务器经常自动重启,惠普电脑经常自动重启的解决方法
- 直线分割平面的公式_直线分割平面-jiangwen127-ChinaUnix博客
- springboot 集成quartz带数据库持久化
- 计算机组成原理A原是什么,计算机组成原理(A).doc
- 113.库存明细账案例(包含结存数)
- 基于51单片机的汽车自动照明灯超声波光敏检测远近光灯方案原理图设计
- 连接到系统上的设备没有发挥作用解决方案
- Android开发之UI线程和非UI线程
- pintia计算机课程考试多选题,大学计算机基础与应用2(理)-中国大学mooc-题库零氪...
- 某页式虚拟存储器,若某用户空间为16个界面,页面大小为1KB,现有页表如下,逻辑地址0A2CH所对应的物理地址为
热门文章
- lol游戏官网html模板,imageLolder
- 无法解压文件请重新启动计算机,解压文件是弹出来说4G以上的文件无法解压是怎么回事...
- 从 HTTP 协议求解:为什么我们越来越不需要雪碧图了?
- 使用chatgpt一分钟帮你实现思维导图
- 怎样做到参加会议“到有所获”?
- @程序员,终于可以放心写bug了!Facebook的debug神器你值得拥有
- 中国统计年鉴2018
- 安卓系统管理软件_安卓用户,你的微信又要变了
- 汽车零件产品开发过程A样件、B样件和C样件的区别?
- 数据处理中白化Whitening的作用图解分析