C++ 实现守护进程

news2024/12/23 18:59:42

文章目录

    • 1.守护进程概念
      • 1.什么是守护进程
      • 2.守护进程的特点
      • 3.如何查看linux系统中已存在的守护进程
    • 2.守护进程编写的步骤
    • 3.示例


1.守护进程概念

1.什么是守护进程

  • Linux Deamon守护进程是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或者等待处理某些事件的发生

  • 它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的

  • 它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的

  • 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。

  • 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
    在这里插入图片描述

  • 一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。

2.守护进程的特点

  • 守护进程都具有超级用户的权限。

  • 守护进程的父进程是init进程。

  • 守护进程都不用控制终端,其TTY列以“?”表示,TPGID为-1.

  • 守护进程都是各自进程组合会话过程的唯一进程。

3.如何查看linux系统中已存在的守护进程

ps axj		#查看系统中的守护进程
ps axj |grep daemon		#使用管道过滤想要查看的守护进程

在这里插入图片描述
在这里插入图片描述

2.守护进程编写的步骤

  • 创建子进程,父进程退出
m_pid = fork();//创建子进程
if (m_pid < 0)
{
	exit(1);
}
else if (m_pid > 0)
{
	exit(0);//父进程退出
}
  • 在子进程中创建新对话
setsid();//若当前进程不是进程组长,创建一个新会话;若当前进程已经是进程组长,返回错误
  • 改变当前目录为根目录
chdir("/");
  • 重设文件权限掩码
umask(0);//设置进程的权限掩码,参数0表示:可以设置任何权限(读、写、执行)
  • 关闭文件描述符
for (int i = 0; i < getdtablesize(); i++) {
	close(i);
	printf("文件描述符关闭成功!");
}
  • 守护进程退出处理

3.示例

完整示例:

/*
* 守护进程
*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <sstream>
#include <ctime>
#include <stdio.h>
#include <cstdlib>
#include <sys/stat.h>
#include <time.h>
#include <assert.h>
#include <unistd.h>

int main()
{
	// 1.在父进程中执行fork并exit退出;
	pid_t m_pid;
	m_pid = fork();//创建子进程

	if (m_pid < 0)
	{
		exit(1);
	}
	else if (m_pid > 0)
	{
		exit(0);//父进程退出
	}

	// 2.在子进程中调用setsid函数创建新的会话;
	setsid();//若当前进程不是进程组长,创建一个新会话;若当前进程已经是进程组长,返回错误

	// 3.调用getcwd()函数获取当前目录路径,并在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
	char m_path[1024];
	if (getcwd(m_path, sizeof(m_path)) == NULL)
	{
		perror("get path error!");
		exit(1);
	}
	printf("get path success !");

	chdir("/");

	// 4.在子进程中调用umask函数,设置进程的umask为0
	umask(0);//设置进程的权限掩码,参数0表示:可以设置任何权限(读、写、执行)

	// 5.在子进程中关闭任何不需要的文件描述符
	for (int i = 0; i < getdtablesize(); i++) {
		close(i);
		printf("文件描述符关闭成功!");
	}


	printf("守护进程构建成功!");
	while (1) {
		/*
		* do anything...
		*/

		FILE* fp = fopen("/tmp/mytest.log", "a");
		assert(fp != NULL);

		time_t rawtime;
		struct tm* ptminfo;

		time(&rawtime);
		ptminfo = localtime(&rawtime);
		printf("current: %02d-%02d-%02d %02d:%02d:%02d\n",
			ptminfo->tm_year + 1900, ptminfo->tm_mon + 1, ptminfo->tm_mday,
			ptminfo->tm_hour, ptminfo->tm_min, ptminfo->tm_sec);

		fprintf(fp, "守护进程测试:%02d-%02d-%02d %02d:%02d:%02d\n\n", ptminfo->tm_year + 1900, ptminfo->tm_mon + 1, ptminfo->tm_mday,
			ptminfo->tm_hour, ptminfo->tm_min, ptminfo->tm_sec);
		fclose(fp);
		sleep(5);
	}

}

编译执行结果
在这里插入图片描述
运行后日志打印:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统小工具API接口,免费好用

1、前言 系统小工具接口&#xff0c;可生成长短不重复id&#xff0c;可获取服务器标准时间。 查看接口完整信息&#xff1a;https://www.idmayi.com/doc/detail?id23 2、接口明细 注意&#xff1a;app_id和app_secret是临时秘钥&#xff0c;如果真正使用&#xff0c;需要去 ht…

ArrayList源码解析

ArrayList源码解析 简介 ArrayList 是一种以数组实现的 List&#xff0c;与数组相比&#xff0c;它具有动态扩展的能力&#xff0c;因此也可称之为动态数组。 ArrayList 线程不安全&#xff0c;除该类未实现同步外&#xff0c;其余跟 Vector 大致相同。 Java 泛型只是编译器…

赛先生的新旅行:昇腾AI带来的科学智能变革

《三体》动画即将开播&#xff0c;又一次引发了全球科幻迷的无限热情。提到《三体》&#xff0c;大家有很多深刻记忆。其中之一是三体人在入侵地球之前&#xff0c;首先是派智子锁死地球的基础科学进步&#xff0c;从而限制人类的整体发展。很多人会担心&#xff0c;物理、化学…

LeetCode题解12 (146,97) LRU缓存<HashMap + 双向链表>,二叉树的中序遍历

文章目录LRU缓存(146)完整代码解答:二叉树的中序遍历(94)完整代码解答:LRU缓存(146) 从题上看存在Key和Value因此我们采用HashMap来进行存储,这里我们采用HashMap双向链表来实现,我们需要实现里面的get,put方法。 我们需要先创建1个链表节点 //先定义一个节点类 class ListNode…

一个合格的程序员也是一名合格的侦探---Debug篇

调试 文章目录调试1.什么是bug&#xff1f;1.1bug概念1.2bug的起源2.什么是调试&#xff0c;调试的重要性2.1调式的概念2.2 调试的基本步骤2.3Debug版本和Release版本2.3.1Debug版本2.3.2Release版本2.3.3区别2.3.4同一代码在Debug和Release下的差别3.Windows下visual stdio的调…

ioDraw - 免费的在线图表制作工具

介绍&#xff1a; ioDraw是一款数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff0c;支持折线图、柱状图、饼图、散点图等 地址&#xff1a;https://www.iodraw.com/chart 特点&#xff1a; 图表…

springboot实现License证书的授权和许可到期验证

前言 在客户服务器部署软件项目后&#xff0c;为了项目版权管控或者对项目进行授权收费处理的&#xff0c;就需要实现项目的授权和许可验证。 在这里讲解的是使用 license证书 的形式实现授权和许可验证&#xff08;已通过测试&#xff09;。 主要是通过 IP地址、MAC地址、CP…

PyTorch - 线性回归

文章目录普通实现准备数据反向传播构建模型 实现实例化模型、损失函数、优化器训练数据评估模型普通实现 准备数据 import torch import matplotlib.pyplot as plt # 1、准备数据 # y 2 * x 0.8 x torch.rand([500, 1]) y_true 2 * x 0.8 # 2、通过模型计算 y_predict …

MyBatis面试题(2022最新版)

整理好的MyBatis面试题库&#xff0c;史上最全的MyBatis面试题&#xff0c;MyBatis面试宝典&#xff0c;特此分享给大家 MyBatis简介 MyBatis是什么&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它…

Kotlin 开发Android app(二十一):协程launch

什么是协程&#xff0c;这可是这几年才有的概念&#xff0c;我们也不用管它是什么概念&#xff0c;先看看他能做什么。 创建协程 添加依赖&#xff1a; implementation org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9implementation org.jetbrains.kotlinx:kotlinx-cor…

DCDC电感下方铜箔如何处理

挖&#xff1a;电感在工作时&#xff0c;其持续变化的电流产生的电磁波会或多或少的泄露出来&#xff0c;电感下方的铜箔受电磁波影响&#xff0c;就会有涡流出现&#xff0c;这个涡流&#xff0c;①可能对线路板上的信号线有干扰&#xff0c;②铜箔内的涡流会产生热量&#xf…

申请阿里云域名SSL证书步骤

1.【点击登录】 阿里云 2.选择 DV单域名证书 3.确定购买&#xff0c;支付。 4.完成后&#xff0c;跳转回控制台。 5.点击 证书申请。 6.填写域名、申请人姓名、手机号、邮箱、所在地 7、选择域名验证方式&#xff0c;官方提供了三种验证方式&#xff0c;根据自身情况选择其中…

【Linux】Linux的常见指令详解(下)

目录 前言 head/tail 命令行管道 date sort cal 搜索指令 find which whereis alias grep zip tar file bc history 热键 前言 之前讲了Linux的常见指令详解&#xff08;上&#xff09;&#xff0c;这次终于把下也补齐了。如果对你有帮助还麻烦给博主一个…

Netty_05_六种序列化方式(JavaIO序列化 XML序列化 Hessian序列化 JSON序列化 Protobuf序列化 AVRO序列化)(实践类)

文章目录一、普通的序列化方式(bean对象有直接的java类)1.1 普通的java io byteArray输入输出流的序列化方式1.2 xml序列化方式&#xff08;xml用来做配置文件&#xff0c;这样序列化出来长度很大&#xff09;1.3 Hessian序列化方式&#xff08;这个Dubbo中使用的序列化方式&am…

flask前后端项目--实例-前端部分:-3-vue基本配置

一、基本配置以及验证 1.基础环境&#xff1a;nodejs的安装配置以及注意事项 https://blog.csdn.net/wtt234/article/details/128131999 2.vue使用vite创建文件包的过程 创建项目 npm init vitelatest 根据提示一步步选择&#xff1a; 选择vue 进入项目目录&#xff0c;安装…

【计算机网络】网络层:IPV6

IPV4耗尽&#xff0c;使用具有更多地址空间的IPV6 IPV6特点&#xff1a; (1)IPV6地址128位&#xff0c;更大地址空间&#xff0c;可以划分位更多的层次 (2)IPV6定义许多拓展首部&#xff0c;可提供更多功能&#xff0c;但IPV6首部长度固定&#xff0c;选项放在有效载荷中 (…

打败阿根廷的究竟是谁

2022年卡塔尔世界杯正在如火如茶的进行着。在今年的世界杯中&#xff0c;有两个令人意外的点&#xff0c;一个是日本队击败的德国队&#xff0c;另外一点是沙特队战胜了实力强盛的阿根廷队。 有人说打败阿根廷队的不是沙特队&#xff0c;而是科技------"半自动越位"技…

某Y易盾滑块acToken、data逆向分析

内容仅供参考学习 欢迎朋友们V一起交流&#xff1a; zcxl7_7 目标 网址&#xff1a;案例地址 这个好像还没改版&#xff0c;我看官网体验那边已经进行了混淆 只研究了加密的生成&#xff0c;环境不正确可能会导致的加密结果对 (太累了&#xff0c;先缓缓吧&#xff0c;最近事比…

创建Mongo官方的免费数据库并使用VSCode连接

注册账号 https://cloud.mongodb.com/ 在这个平台注册账号&#xff0c;并登录 创建数据库 选择shared&#xff0c;其他要收费 导入样本数据 导入后会发现数据中多了很多sample数据&#xff0c;用于练习 创建访问用户 允许任何地址访问 如果需要任何IP地址都能访问&#xff…

Qt-数据库开发-用户登录、后台管理用户(6)

Qt-数据库开发-使用QSqlite数据库实现用户登录、后台管理用户功能 文章目录Qt-数据库开发-使用QSqlite数据库实现用户登录、后台管理用户功能1、概述2、实现效果3、主要代码4、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;数据库开发 &…