Linux: 守护进程

Linux: 守护进程

  • (一)前台进程和后台进程
    • 前台进程
    • 后台进程
  • (二)会话、进程组、进程的关系
  • (三)守护进程
    • 创建守护进程

(一)前台进程和后台进程

前台进程

前台进程是指当前正在终端中运行,并占用标准输入、输出和错误输出的作业。它通常与用户的交互密切相关,例如用户正在使用的应用程序或服务。
前台进程就是能对键盘文件

后台进程

后台进程则是指不直接与用户交互的应用程序或服务。这类进程可能仍然在执行某些任务,但并不占据用户的注意力。

创建后台进程:

可执行程序 &

在这里插入图片描述

jobs命令:
jobs 是一个用于查看当前 shell 中后台作业状态的内置命令。它主要用于显示由当前 shell 启动并仍在运行或已停止的作业列表。
在这里插入图片描述

fg + 后台进程号命令:
将后台任务提到前台
在这里插入图片描述

bg + 后台进程号:
将已暂停的后台进程重启
在这里插入图片描述

(二)会话、进程组、进程的关系

实际上我们使用 XShell 等工具登录 Linux 服务器时,会在服务器中创建一个 会话(bash),可以在该会话内创建 进程,当 进程 间有关系时,构成一个 进程组,组长 进程的 PID 就是该 进程组 的 PGID。
在这里插入图片描述

我们通过下面这个例子来验证上面的结论

sleep 1000 | sleep 2000 | sleep 3000 &sleep 100 | sleep 200 | sleep 300

在这里插入图片描述
可以发现 每一组的进程组 PGID 都与当前组中第一个被创建的进程 PID 一致,这个进程被称为 组长进程。无论是 后台进程 还是 前台进程,都是从同一个 bash 中启动的,所以它们处于同一个 会话 中,SID 和 终端文件 TTY 都是一样的。

每一个进程组就是执行同一个任务,只不过一个任务被分成了不用进程去执行。

Linux 中一切皆文件,终端文件也是如此,这里的终端其实就是当前 bash 输出结果时使用的文件(也就是屏幕),终端文件位于 dev/pts 目录下,如果向指定终端文件中写入数据,那么对方也可以直接收到

在这里插入图片描述
bash 进程本质上就是一个不断运行中的 前台进程,并且自成 进程组。

所以 SID 其实就是 bash 的 PID。在同一个 bash 中启动前台、后台进程,它们的 SID 都是一样的,属于同一个 会话,关联了同一个 终端。
在这里插入图片描述

(三)守护进程

守护进程:进程单独成一个会话,并且以后台进程的形式运行。

应用场景:一种长期运行的后台任务,通常用于执行诸如日志记录、定时任务或其他需要持续运行的服务功能。

创建守护进程

方法一:
该函数用于创建守护进程,原型如下:

#include <unistd.h>
int daemon(int nochdir, int noclose);

参数说明:

  • nochdir 改变进程的工作路径
    通常,daemon 函数会将当前工作目录更改为根目录(“/”),以避免当前目录被卸载。
  • noclose 重定向标准输入、标准输出、标准错误

返回值:

  • 成功返回 0,失败返回 -1

使用:

程序中调用 daemon(0, 0);

方法二:

通过创造会话手动 创造守护进程,系统提供的接口一键 守护进程化 固然方便,不过大多数程序员都会选择手动 守护进程化(可以根据自己的需求定制操作)

该函数用于创建一个会话。创建会话需要注意不能是一个进程组的组长(即进程组的id不能是该进程的pid)

#include <unistd.h>
pid_t setsid(void);

返回值:

  • 成功返回该进程的 pid,失败返回 -1

手动实现守护进程需注意以下几点:

  • 忽略异常信号
    避免异常信号影响守护进程
  • 0、1、2 要做特殊处理(文件描述符)
    守护进程一般只要保持运行即可,不需要进行输入输出(比如服务器),若有需要关注的信息可以写入日志中。
  • 进程的工作路径可能要改变(从用户目录中脱离至根目录)
    改变守护进程的路径到 一个安全的位置, 避免目录的变动影响 守护进程

使用例子:

#pragma once #include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>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.将自己设置为独立会话   ---创建会话需要注意不能是一个进程组的组长,通过fork函数来完成。if (fork() > 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);}
}

/dev/dull 就是一个垃圾桶文件。

总的来说 守护进程用于在后台运行且独立于控制终端的特殊进程。它通常由系统启动并持续运行,提供各种服务而不受用户交互影响。这些进程主要用于执行定期任务、监控系统状态以及响应网络请求等功能。

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

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

相关文章

6.4.5_关键路径

AOE网&#xff1a; 用EEdge表示活动&#xff0c;AOV网是用Vertex顶点表示活动 仅有一个入度0的顶点叫开始顶点(源点)&#xff0c;出度0的顶点叫结束顶点(汇点) 各条边表示活动&#xff0c;边上的权值表示完成该活动的开销&#xff0c;各顶点表示事件&#xff0c;事件是就发生…

Oracle 的 TX、TM、UL 锁对比

Oracle 的 TX、TM、UL 锁对比 Oracle 数据库中的这三种锁机制在并发控制中扮演着不同角色&#xff0c;以下是它们的对比分析&#xff1a; 一、基本特性对比 特性TX (事务锁)TM (DML锁)UL (用户锁)锁类型行级锁表级锁应用级自定义锁作用范围保护数据行变更保护表结构不被修改…

Kruskal-Wallis检验 vs. 多次Wilcoxon检验:多重比较-spss

在补充图6中&#xff0c;对喉镜形态分类、病理类型和病程使用 Wilcoxon秩和检验&#xff08;Mann-Whitney U检验&#xff09; 结合 Bonferroni校正&#xff0c;而非 Kruskal-Wallis检验加Dunn’s检验&#xff0c;原因如下&#xff1a; 1. 方法选择的依据 (1) 变量类型与比较组…

vue3+element-plus el-date-picker日期、年份筛选设置本周、本月、近3年等快捷筛选

一、页面代码&#xff1a; <template> <!-- 日期范围筛选框 --> <el-date-picker v-model"dateRange" value-format"YYYY-MM-DD" type"daterange" range-separator"至" start-placeholder"开始日期" end-…

MySQL 关于用户的权限信息查看

1: 先连接mysql : [rootxx ~]# mysql -u admin -p -h 8.8.8.8 -P 3306 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 38 Server version: 8.0.41 Source distribution Copyright (c) 2000, 2025, Oracle and/or …

C++ STL stack容器使用详解

一、stack容器概述 stack容器适配器是C标准模板库(STL)中实现后进先出(LIFO)数据结构的重要组件&#xff0c;它通过封装底层容器&#xff08;如deque/vector/list&#xff09;提供栈操作接口。 二、stack核心操作详解 1. 容器构造方式 // 默认使用deque存储元素 stack<i…

科技趋势分析系统 BBC (Big Bang of Computing)

科技趋势分析系统 BBC (Big Bang of Computing) 技术文档 1. 项目概述 BBC (Big Bang of Computing) 是一个基于 arXiv 论文数据的科技趋势分析系统&#xff0c;旨在通过分析海量的学术文献&#xff0c;结合大语言模型&#xff08;LLM&#xff09;进行增强分析&#xff0c;提…

尚硅谷redis7 55-57 redis主从复制之理论简介

55 redis主从复制之理论简介 定义 Redis 主从复制&#xff08;Master-Slave Replication&#xff09;是 Redis 提供的一种数据冗余和高可用机制&#xff0c;可以让一个 Redis 主节点的数据复制到一个或多个从节点&#xff0c;实现读写分离、容灾备份等功能。 主节点&#xff…

CarPropertyService 介绍

目录 1. CarPropertyService 基本介绍 1.1 CarPropertyService 结构图 1.2 CarPropertyService 的定义与实现 1.3 CarPropertyManager 与 CarPropertyService 2. PropertyHalService 与 CarPropertyService 3. CarPropertyService 的重要接口介绍 3.1 CarPropertyServi…

JavaScript 性能优化按层次逐步分析

JavaScript 性能优化实战 &#x1f4a1; 本文数据基于Chrome 136实测验证&#xff0c;涵盖12项核心优化指标&#xff0c;通过20代码案例演示性能提升300%的实战技巧。 一、代码层深度优化 1. 高效数据操作&#xff08;百万级数据处理&#xff09; // 不良实践&#xff1a;频繁…

【东枫科技】基于Docker,Nodejs,GitSite构建一个KB站点

Docker 安装桌面版本&#xff0c;安装Node镜像 运行node镜像 需求 和外部的某个文件夹地址可以绑定端口可以绑定&#xff0c;方便server的访问 docker run -itd --name node-test -v C:/Users/fs/Documents/GitHub:/home/node -p 3000:3000 node进入终端 docker exec -it …

【小白AI教程】大模型知识扫盲通识

目录 一、究竟什么是大模型 二、大模型的两大分支 2.1 在线大模型 2.2 开源大模型 2.3 大模型的应用 利用行业知识重新训练AI大模型 利用行业知识对AI大模型进行微调 利用行业知识建立知识库 三、Reasoning 大模型 3.1 基本概述 3.2 核心概念 3.3 技术实现 3.4 应…

测试 Gemini Pro 2.5

好的&#xff0c;我已经明白了您的需求。您希望&#xff1a; 增大概览消息&#xff08;Toast&#xff09;的尺寸&#xff1a;使其更加醒目。消息持久性&#xff1a;当在用户中心内部切换不同标签页&#xff08;例如从“个人信息”切换到“安全设置”&#xff09;时&#xff0c…

大模型——MCP 深度解析

MCP 深度解析 套用一句关于幺半群的名言:"MCP 是一种开放协议,用于标准化应用程序向 LLM 提供上下文的方式,问题何在?"但即使花数小时阅读 MCP 的定义并实操示例,仍难以清晰把握其具体运作流程:LLM 负责什么?MCP 服务器做什么?MCP 客户端的角色是什么?数据…

使用 scikit-learn 库对乌克兰冲突事件数据集进行多维度分类分析

使用scikit-learn库对乌克兰冲突事件数据集进行多维度分类分析 背景 在现代冲突研究中&#xff0c;对冲突事件进行多维度分析和可视化可以帮助我们更好地理解冲突的模式、趋势和影响因素。本次作业将使用开源冲突数据&#xff0c;构建一个完整的机器学习分类流程&#xff0c;…

工作流 x 深度学习:揭秘蓝耘元生代如何用 ComfyUI 玩转 AI 开发

目录 一、从 “代码噩梦” 到 “积木游戏”&#xff1a;我与工作流的初次碰撞 二、深度学习&#xff1a;复杂而迷人的 “数字迷宫” &#xff08;一&#xff09;深度学习的神秘面纱 &#xff08;二&#xff09;深度学习的发展历程 &#xff08;三&#xff09;深度学习面临…

《软件工程》第 14 章 - 持续集成

在软件工程的开发流程中&#xff0c;持续集成是保障代码质量与开发效率的关键环节。本章将围绕持续集成的各个方面展开详细讲解&#xff0c;结合 Java 代码示例与可视化图表&#xff0c;帮助读者深入理解并实践相关知识。 14.1 持续集成概述 14.1.1 持续集成的相关概念 持续集…

1992-2021年各省工业增加值数据(无缺失)

1992-2021年各省工业增加值数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1992-2021年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;工业增加值 4、范围&#xff1a;31省 5、缺失情况&#xff1a;无缺失 6、指标说明&#xff1a;工业增加值是…

Android15 Camera Hal设置logLevel控制日志输出

这里说明三个内容 Camera Hal Demo默认使用的也是Android原生日志接口&#xff08;例如&#xff1a;ALOGD, ALOGV&#xff09;&#xff0c;为什么logLevel设置为V级别&#xff0c;但是通过ALOGV打印的日志不输出&#xff0c;不生效Camera Hal Demo在不修改ALOGX接口使用的情况…

C++:设计模式--工厂模式

更多内容&#xff1a;XiaoJ的知识星球 目录 1.简单工厂模式1.1 简单工厂1.2 实现步骤1.3 实现代码1.4 优缺点 2.工厂模式2.1 工厂模式2.2 实现步骤2.3 实现代码2.4 优缺点 3.抽象工厂模式3.1 抽象工厂模式3.2 实现步骤3.3 实现代码3.4 优缺点 1.简单工厂模式 . 1.1 简单工厂 …