当前位置: 首页 > news >正文

重庆潼南网站建设/google chrome网页版

重庆潼南网站建设,google chrome网页版,网站开发的四个高级阶段包括,科技教育司目录 一、守护进程的定义与特点 1、定义 2、特点 二、守护进程的原理 三、守护进程与会话(Session)的关系 四、C实现守护进程 守护进程(Daemon Process)是一个在后台运行、通常不与用户直接交互的进程。守护进程是操作系统中…

目录

一、守护进程的定义与特点

1、定义

2、特点

二、守护进程的原理

三、守护进程与会话(Session)的关系

四、C++实现守护进程

     守护进程(Daemon Process)是一个在后台运行、通常不与用户直接交互的进程。守护进程是操作系统中非常重要的一部分,常见的应用包括系统日志、网络服务、数据库管理等。在这篇博客中,我们将详细探讨守护进程的原理、如何与会话管理联系,并通过C++实现一个简单的守护进程。将服务器守护进程化的主要目的是确保服务器在后台持续运行,并在意外崩溃或重启后自动恢复。这样可以使服务在没有人工干预的情况下长期稳定运行,并减少系统管理的复杂度。

一、守护进程的定义与特点

1、定义

守护进程是一个没有终端控制的进程,它通常在系统启动时启动,独立于任何用户会话(session),并且在后台持续运行。守护进程的特点是它不依赖于用户的输入输出,运行时不会产生终端交互。

2、特点

  • 后台运行:守护进程通常在操作系统启动时启动,或者在用户登录后由系统服务启动,并在后台持续运行。
  • 无终端:守护进程不与任何终端或用户会话关联,它通常不与标准输入输出(stdin, stdout, stderr)相关联。
  • 独立性:守护进程与用户的登录会话是独立的,它在后台静静运行,执行系统级任务,如日志记录、定时任务、文件清理等。
  • 父进程为init进程:守护进程在系统启动时由父进程(通常是init进程)启动,运行时不会退出。
  • PID(进程ID):守护进程的PID是由操作系统分配的,它通常会被写入到某个文件中以供后续管理和终止。

二、守护进程的原理

守护进程是通过脱离控制终端、使自己成为一个独立的后台进程来实现的。这是通过几个步骤实现的:

  1. 创建子进程:守护进程首先会创建一个子进程,父进程退出,子进程继续执行,这样可以让守护进程避免与任何用户会话或终端直接交互。

  2. 创建新的会话(Session):守护进程通常会调用 setsid() 系统调用创建一个新的会话,成为该会话的首进程。新会话的创建意味着它不再与原始的控制终端和进程组相关联。

  3. 改变工作目录:守护进程通常会调用 chdir() 来更改工作目录。为了避免占用终端的目录,守护进程通常会将工作目录更改为 /

  4. 关闭文件描述符:守护进程还会关闭与终端相关的文件描述符,包括标准输入(stdin)、标准输出(stdout)、标准错误(stderr)。通常会将它们重定向到 /dev/null,以防止输出到终端。

  5. 忽略信号:守护进程会设置适当的信号处理,避免因收到如SIGHUP等信号导致进程退出。

void Daemon(const std::string &cwd = "")
{// 1. 忽略其他异常信号 signal(SIGCLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);// 2. 将自己变成独立的会话if (fork() > 0)//>0说明是父进程,让父进程直接退出exit(0);setsid(); //子进程// 3. 更改当前调用进程的工作目录if (!cwd.empty())chdir(cwd.c_str());// 4. 标准输入,标准输出,标准错误重定向至/dev/null 垃圾桶int fd = open(nullfile.c_str(), O_RDWR);if(fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}
}

三、守护进程与会话(Session)的关系

会话(Session)是与进程、终端和进程组密切相关的概念。会话的作用是管理一组相关的进程。

  1. 会话的创建:每个登录的用户会话都有一个会话ID(Session ID),一个会话可以有多个进程组(Process Group),而每个进程组中的进程共享同一个控制终端。

  2. 脱离控制终端:守护进程通过 setsid() 系统调用来脱离当前会话及其控制终端,成为一个新的会话的首进程。这样,守护进程就不再与任何终端关联,它可以自由地运行而不受用户的控制。

  3. 控制终端:一旦守护进程创建了新的会话并成为首进程,它就不再与任何控制终端关联。控制终端通常与用户的登录会话相关联,但守护进程会断开这一关系,避免终端输入或输出干扰其运行。

  4. 进程组与信号处理:会话中的进程通常共享进程组,而进程组的控制由会话首进程管理。守护进程通常会设置信号处理机制,使其能够管理来自进程组的信号。


四、C++实现守护进程

#pragma once#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const std::string nullfile = "/dev/null";void Daemon(const std::string &cwd = "")
{// 1. 忽略其他异常信号 signal(SIGCLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);// 2. 将自己变成独立的会话if (fork() > 0)//>0说明是父进程,让父进程直接退出exit(0);setsid(); //子进程// 3. 更改当前调用进程的工作目录if (!cwd.empty())chdir(cwd.c_str());// 4. 标准输入,标准输出,标准错误重定向至/dev/null 垃圾桶int fd = open(nullfile.c_str(), O_RDWR);if(fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}
}
#pragma once#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <signal.h>
#include <signal.h>
#include "Log.hpp"
#include "ThreadPool.hpp"
#include "Task.hpp"
#include "Daemon.hpp"const int defaultfd = -1;
const std::string defaultip = "0.0.0.0";
const int backlog = 10; // 但是一般不要设置的太大
extern Log lg;enum
{UsageError = 1,SocketError,BindError,ListenError,
};class TcpServer;class ThreadData
{
public:ThreadData(int fd, const std::string &ip, const uint16_t &p, TcpServer *t): sockfd(fd), clientip(ip), clientport(p), tsvr(t){}
public:int sockfd;std::string clientip;uint16_t clientport;TcpServer *tsvr;
};class TcpServer
{
public:TcpServer(const uint16_t &port, const std::string &ip = defaultip) : listensock_(defaultfd), port_(port), ip_(ip){}void InitServer(){listensock_ = socket(AF_INET, SOCK_STREAM, 0);if (listensock_ < 0){lg(Fatal, "create socket, errno: %d, errstring: %s", errno, strerror(errno));exit(SocketError);}lg(Info, "create socket success, listensock_: %d", listensock_);int opt = 1;setsockopt(listensock_, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &opt, sizeof(opt)); // 防止偶发性的服务器无法进行立即重启(tcp协议的时候再说)struct sockaddr_in local;memset(&local, 0, sizeof(local));local.sin_family = AF_INET;local.sin_port = htons(port_);inet_aton(ip_.c_str(), &(local.sin_addr));// local.sin_addr.s_addr = INADDR_ANY;if (bind(listensock_, (struct sockaddr *)&local, sizeof(local)) < 0){lg(Fatal, "bind error, errno: %d, errstring: %s", errno, strerror(errno));exit(BindError);}lg(Info, "bind socket success, listensock_: %d", listensock_);// Tcp是面向连接的,服务器一般是比较“被动的”,服务器一直处于一种,一直在等待连接到来的状态if (listen(listensock_, backlog) < 0){lg(Fatal, "listen error, errno: %d, errstring: %s", errno, strerror(errno));exit(ListenError);}lg(Info, "listen socket success, listensock_: %d", listensock_);}void Start(){Daemon();ThreadPool<Task>::GetInstance()->Start();// for fork();// signal(SIGCHLD, SIG_IGN);lg(Info, "tcpServer is running....");for (;;){// 1. 获取新连接struct sockaddr_in client;socklen_t len = sizeof(client);int sockfd = accept(listensock_, (struct sockaddr *)&client, &len);if (sockfd < 0){lg(Warning, "accept error, errno: %d, errstring: %s", errno, strerror(errno)); //?continue;}uint16_t clientport = ntohs(client.sin_port);char clientip[32];inet_ntop(AF_INET, &(client.sin_addr), clientip, sizeof(clientip));// version 4 --- 线程池版本Task t(sockfd, clientip, clientport);ThreadPool<Task>::GetInstance()->Push(t);}}~TcpServer() {}private:int listensock_;uint16_t port_;std::string ip_;
};

表示服务已经启动

相关文章:

服务器守护进程化

目录 一、守护进程的定义与特点 1、定义 2、特点 二、守护进程的原理 三、守护进程与会话&#xff08;Session&#xff09;的关系 四、C实现守护进程 守护进程&#xff08;Daemon Process&#xff09;是一个在后台运行、通常不与用户直接交互的进程。守护进程是操作系统中…...

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破

12月1日至2日&#xff0c;2024世界传感器大会&#xff08;WSS&#xff09;在郑州国际会展中心隆重举办&#xff0c;泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛&#xff0c;并在大会上带来《激光雷达用一体化光纤光源》专题演讲&#xff0c;同与…...

day35—蓝桥杯2024年第16届校赛模拟第二期-T4(最小花费)

【问题描述】 小蓝有一个整数&#xff0c;初始值为 1 &#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花费 1 的代价将整数增加 1 。 小蓝可以花费 3 的代价将整数增加一个值&#xff0c;这个值是整数的数位中最大的那个&#xff08;1 到 9&#xff09;。 小蓝可…...

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…...

游戏引擎学习第38天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上&#xff0c;但颜色错误的问题。问题最终查明是因为使用了一个调整工具&#xff0c;导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…...

P1223 排队接水(贪心)

题目描述 有 &#x1d45b;个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 &#x1d447;&#x1d456;&#xff0c;请编程找出这 &#x1d45b; 个人排队的一种顺序&#xff0c;使得 &#x1d45b;个人的平均等待时间最小。 输入格式 第一行为一个整数 &am…...

关于springBoot+vue项目中配置SSL证书问题

前端可以通过https进行访问 1.前端在访问后端接口时&#xff0c;使用https进行访问&#xff0c;在request.js配置文件中&#xff0c;这个文件是配置axios的基本请求的&#xff0c;在基础请求地址中改为https方式 2.需要在Linux中的nginx中配置ssl证书&#xff0c;具体请参考&…...

GUI的最终选择:Tkinter

Tkinter是Python默认的GUI库&#xff0c;因此使用时直接导入即可&#xff1a;import tkinter 17.1 Tkinter之初体验 代码分析&#xff1a; tkinter.mainloop()通常是程序的最后一行代码&#xff0c;执行后程序进入主事件循环。 17.2 进阶版本 将代码封装成类&#xff1a; 运…...

Photohop关于数位板没有压力感,PS画笔的钢笔压力总是显示感叹号的问题解放方法

&#xff08;实际我只用到红色字2步解决了问题&#xff0c;但为了兼顾更多朋友&#xff0c;还是把其他步骤详细完善&#xff09; 一&#xff0c;先确定数位板正常链接电脑&#xff0c;并安装好驱动&#xff0c;并在驱动测试到压力 二&#xff0c;解决PS前感叹号问题 &#xf…...

rust websocket Echo server高性能服务器开发

最近在学习websocket时,一直没有发现好的websocket server工具来调试,于是就自己做了一个websocket server用来学习和调试。因为rust性能遥遥领先,所以就采用了rust来搭建服务器。废话不多说直接上代码main.rs: use tokio::net::TcpListener; use tokio_tungstenite::tung…...

19、网络编程:

19、网络编程&#xff1a; 网络的相关概念&#xff1a; 网络通讯&#xff1a; 概念&#xff1a;两台设备之间通过网络实现数据传输&#xff1b;网络通讯&#xff1a;将数据通过网络从一台设备传输到另一台设备&#xff1b;java.net包下提供了一系列的类或接口&#xff0c;供…...

[代码随想录11]栈和队列的应用,逆波兰表达式求值 、滑动窗口最大值、前 K 个高频元素

前言 这几个题目都是栈和队列的高频面试题目&#xff0c;主要是考察思路和coding能力&#xff0c;在前面几道题目的基础上进行延伸的。同时还有优先级队列和双端队列的用法 题目链接 150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 239. 滑动窗口最大值 - 力…...

认证插件介绍

本文档是针对 UOS 登录器插件给出开发指南&#xff0c;目的是为了让开发人员了解如何在 UOS 登录器上增加一种自定义认证方式&#xff0c;对插件接口做了详细说明以及实战练习。 文章目录 一、认证插件可以做什么&#xff1f;二、认证流程三、术语说明四、安全性五、可靠性六、…...

ASP.NET Core8.0学习笔记(二十四)——EF Core级联插入与删除

一、EF Core导航关系操作——级联插入 1.级联插入&#xff1a;在含有导航属性的实体&#xff08;主体实体&#xff09;中可以对实体进行级联插入。即在创建主体实体时直接把依赖实体进行赋值&#xff0c;此时只需要执行一次插入操作即可将主体实体与依赖实体同时入库。同时&am…...

Docker打包SpringBoot项目

一、项目打成jar包 在进行docker打包之前&#xff0c;先确定一下&#xff0c;项目能够正常的打成JAR包&#xff0c;并且启动之后能够正常的访问。这一步看似是可有可无&#xff0c;但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后&#xff0c;需要编写Doc…...

【Linux】WSL:Win运行Linux

WSL2&#xff08;Windows Subsystem for Linux 2&#xff09; 是 Microsoft 开发的技术&#xff0c;可在 Windows 系统上运行完整的 Linux 发行版环境。以下是详细的配置教程。 安装与配置 启用 WSL 功能 打开“开始”菜单&#xff0c;搜索 PowerShell&#xff0c;以 管理员身…...

js循环导出多个word表格文档

文章目录 js循环导出多个word表格文档一、文档模板编辑二、安装依赖三、创建导出工具类exportWord.js四、调用五、效果图js循环导出多个word表格文档 结果案例: 一、文档模板编辑 二、安装依赖 // 实现word下载的主要依赖 npm install docxtemplater pizzip --save// 文件操…...

Spring Boot 日志 配置 SLF4J 和 Logback

前言 在开发 Java 应用时&#xff0c;日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息&#xff0c;帮助开发者快速定位和解决问题。Spring Boot 项目默认集成了 SLF4J 和 Logback&#xff0c;使得日志配置变得简单而灵活。本文将详细介绍如何在 …...

企业级包管理器:专栏概述 (1)

在当今的前端开发领域&#xff0c;包管理器已经成为了每一位开发者不可或缺的工具。它们就像一个个神奇的工具箱&#xff0c;里面装满了各种各样的工具&#xff08;即软件包&#xff09;&#xff0c;帮助我们快速搭建项目、实现功能&#xff0c;极大地提高了开发效率。接下来&a…...

【动手学电机驱动】STM32-MBD(1)安装 STM32 硬件支持包

STM32-MBD&#xff08;1&#xff09;安装 STM32 硬件支持包 【动手学电机驱动】STM32-MBD&#xff08;1&#xff09;安装 STM32 硬件支持包 1. 必须的软硬件条件2. 嵌入式硬件支持包2.1 Embedded Coder2.2 嵌入式硬件支持包2.3 Embedded Coder Support Package for STMicroelec…...

书后习题答案:《Python程序设计基础(第2版)》,电子工业出版社,2020.01

【持续更新】 第3章 from math import *x1 float(input("请输入x1: ")) # print(x1) x2 float(input("请输入x2: ")) y1 float(input("请输入y1: ")) y2 float(input("请输入y2: "))dis sqrt(pow(x1 - x2, 2) pow(y1 - y2, 2))…...

Qt之第三方库‌QXlsx使用(三)

Qt开发 系列文章 - QXlsx&#xff08;三&#xff09; 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.添加头文件 2.写入数据 3.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用…...

Python通过global实现多文件共享全局参数,方法

Python通过global实现多文件共享全局参数 global关键字,全局变量 基础用法 这种用法&#xff0c;不能在其他的py文件中使用&#xff0c; x 6 def func():global x #定义外部的xx 10 func() print (x) #输出10共享参数 新建glo.py文件&#xff08;全局变量文件&#xff09;…...

DevOps工程技术价值流:项目构建工具的选择与实践

在快速迭代的软件工程领域&#xff0c;项目构建工具扮演着举足轻重的角色。它们不仅自动化了构建、测试、打包和部署等关键环节&#xff0c;还显著提升了开发效率和质量。本文将深入探讨后端常用的Maven和Gradle&#xff0c;以及前端不可或缺的NPM&#xff0c;并重点对比Maven与…...

【数据库】复习

数据库期中复习——概念填空_在修改数据结构时,为了保证数据库的数据独立性-CSDN博客 选择题 关系数据理论-数据库习题_数据库关系理论考题-CSDN博客 关系、关系模式、关系模型区别和联系 关系&#xff1a;元组的集合&#xff0c;一张表 关系模式&#xff1a;关系的描述 R(…...

CorsConfig前后端数据跨域连接,IDEA右侧Maven窗口消失

前后端数据跨域连接&#xff08;分页查询并显示&#xff09; 一、后端添加分页查询 分页查询核心就是&#xff1a;每页需要显示多少条记录(pageSize)&#xff0c;当前查看第几页(pageNum);MySQL提供了分页函数limit m,n select * from table limit (pageNum-1)*pageSize, pa…...

Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展&#xff0c;详细解释了如何利用Python进行微博爬虫&#xff0c;爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了&#xff0c;就是用户利用代码模拟Ajax请求&#xff0c;发…...

【设计模式】单例模式 在java中的应用

文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式&#xff08;线程不安全&#…...

burp suite 8

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

为什么在Java中super与this不能共存于子类构造器中,其中this起什么作用

在 Java 中&#xff0c;super 和 this 是两个关键字&#xff0c;它们在子类的构造器中有特定的用途和限制。 super 关键字&#xff1a; super 用于从父类&#xff08;超类&#xff09;访问成员&#xff08;属性和方法&#xff09;或者调用父类的构造方法。 在子类的构造器中&…...