永不休眠:Linux 守护进程的工作原理

永不休眠:Linux 守护进程的工作原理

个人主页:chian-ocean

文章专栏-NET

永不休眠:Linux 守护进程的工作原理

前言

在 Linux 系统中,守护进程(Daemon)是指那些在后台运行的进程,通常不与用户直接交互,而是提供某种服务或者完成系统任务。守护进程通常在系统启动时启动,并在系统运行时持续存在。
在这里插入图片描述

进程信息字段含义

image-20250613220101763
字段含义用途示例
PPID父进程 ID表示当前进程的父进程的进程 ID。帮助追踪进程的父子关系。23449
PID进程 ID唯一标识当前进程。通过 PID 可以管理进程。24284
PGID进程组 ID标识当前进程所在的进程组。用于管理相关进程。24284
SID会话 ID标识当前进程所属的会话 ID。会话是共享同一个控制终端的进程集合。23449
TTY终端类型指当前进程所使用的终端设备。pts/0
TPGID控制终端的进程组 ID标识该进程所属的控制终端的进程组。24284
STAT进程状态表示进程当前的状态。常见状态包括休眠、运行、停止等。S+
UID用户 ID表示当前运行该进程的用户的标识符。1000
TIME进程占用的 CPU 时间显示该进程使用的 CPU 时间,格式为“分钟:秒”。0:00
COMMAND执行的命令显示当前进程正在执行的命令或程序。sleep 100

进程组ID(PGID

image-20250613220115253
  • PGID(进程组 ID) 表示进程所在的进程组的标识符。在该输出中,所有进程的 PGID 都是 25091,说明这些进程都属于同一个进程组。
  • 这个进程组的 leader(进程组长) 是 PID 25091(它的 PGID 值是它自己的 PID),也就是说,这个进程(PID 25091)是该进程组的领导者。该进程组中的其他进程(例如 PID 25092、25093)都是由该进程创建的,它们与进程组共享同一个 PGID

为什么 PGID 相同?

  • 进程组是一个将多个相关进程组织在一起的机制。在这个例子中,sleep 100 进程的多个实例(PID 25091、25092、25093)都属于同一个进程组,它们的 PGID 是相同的。
  • 这种设计允许操作系统同时管理多个进程,比如向整个进程组发送信号,进行进程组控制等。

会话ID(SID

image-20250613220119253
  • 在这里面我们创建了三个会话,SID 分别为 224492240325410分别控制着不同的终端( TTY

在此会话中我们执行

sleep100|sleep100|sleep100
image-20250613220122467

观察进程 sleep SID = 24003

  • 所有显示的 sleep 进程的 SID 都是 24003。这表明所有这些 sleep 进程属于同一个会话,即它们共享相同的会话 ID。
  • SID 表示这些进程是同一个会话中的进程,会话中的所有进程都具有相同的 SID

bash : 会话的领导者

  • 会话的 SID 通常等于会话的 leader(会话领导进程)的 PID。因此,SID = 24003 表明会话中的领导进程的 PID 是 24003。这个进程的 PID 会作为会话的 SID
  • 这些 sleep 进程的 SID24003,表明它们是由 PID = 24003 启动的进程所创建,并且它们共享该会话。

前后台进程

定义

  • 前台进程 是那些直接与用户交互并占用当前终端的进程,通常它们会接收用户输入并显示输出。
#include<iostream>#include<unistd.h>usingnamespace std;intmain(){while(1){ cout <<"hello proc "<<endl;sleep(1);}return0;}
  • 执行代码在前台进程,执行指令(./文件名):
image-20250613220127778
  • 后台进程 则是在后台运行的进程,它们不直接与用户交互,不占用终端,通常用于执行长时间运行的任务,如守护进程或定时任务。
  • 如果在后台进程的执行的指令就是:
./文件名 &
image-20250613220132041

后台进程的特点

  • 不占用终端:后台进程不会占用当前的控制终端(即用户的输入输出设备)。当你将一个进程放入后台运行时,终端仍然可以用来执行其他命令。
  • 不与用户交互:后台进程不直接与用户交互,因此它不会阻塞终端的使用。例如,你可以在后台运行一个长时间的下载任务,而继续在前台执行其他任务(如编辑文件、查看文件等)。
  • 异步执行:后台进程通常是异步执行的,即它们独立于当前正在运行的进程执行,不会干扰前台进程的执行

前后台进程的操作

jobs显示后台作业

image-20250613220135254
  • 当前证明有11个任务在同时跑。

fg将后台作业带回前台

fg -进程编号 
image-20250613220343590

分析

  • 后台运行程序:执行了 ./a.out &,该命令将程序 a.out 在后台运行,并返回了进程号 [1] 27998,表示后台程序正在运行。
  • 查看输出:输入了 hello proc,终端多次显示了这个字符串,可能是 a.out 程序的输出内容。
  • 调到前台:使用 fg 1 将后台运行的程序(作业号 1)调到前台,使其开始在前台运行。此时可以看到程序输出持续显示。
  • 终止程序:按下 CTRL + C(中断信号),终止了在前台运行的程序。

bg将后台作业带回前台

bg -进程编号 
image-20250613220347268

分析:

  • ./a.out:执行这个命令来运行已编译的程序 a.out。程序打印了三次 hello proc 到终端。
  • ^Z:这是一个键盘快捷键,用来暂停(停止)正在运行的程序。程序被挂起,并显示消息 [1]+ Stopped,表示该进程已暂停。
  • bg 1bg 命令用于将停止的进程(此处为作业号 1)恢复到后台继续运行。这样程序就可以继续执行,而不会占用终端。
  • ./a.out &:程序现在在后台运行,输出继续显示 hello proc

守护进程

守护进程(Daemon)是计算机中在后台运行的一个长期存在的进程,通常在操作系统启动时自动启动,并在系统关闭时停止。它不与用户直接交互,而是负责执行一些后台任务,如定时任务、系统监控、服务提供等。

守护进程的特点

  1. 后台运行:守护进程不与终端直接交互,它们在后台运行,并且不会因用户登出而终止。、
  2. 自启动和长期运行:大多数守护进程在系统启动时自动启动,并且通常会一直运行直到系统关闭或守护进程被手动停止。
  3. 与终端分离:守护进程通常会与终端或控制台分离,这意味着它们不依赖于任何终端会话,甚至在用户退出登录后也会继续运行。

编写守护进程

#pragmaonce // 防止该头文件被多次包含#include<iostream>// 引入输入输出流库#include<unistd.h>// 引入Unix标准函数库(比如fork, setsid等)#include<string>// 引入C++标准字符串库#include<signal.h>// 引入信号处理库(signal相关函数)#include<sys/types.h>// 包含系统数据类型(pid_t等)#include<sys/stat.h>// 引入文件状态和权限库#include<fcntl.h>// 引入文件控制库const std::string nullfile ="/dev/null";// 定义一个常量 nullfile,表示 Unix 系统中的空设备文件 /dev/nullvoiddaemon(const std::string chdir =""){// 忽略一些常见的信号signal(SIGCHLD, SIG_IGN);// 忽略子进程结束信号(不需要等待子进程)signal(SIGPIPE, SIG_IGN);// 忽略管道破裂信号signal(SIGSTOP, SIG_IGN);// 忽略停止信号(通常用户发送的 Ctrl+Z)// 将当前进程变为独立会话的领导者if(fork()>0){// 父进程退出,子进程继续exit(1);}setsid();// 创建新的会话,脱离终端,成为会话领导者// 如果传入了工作目录路径,尝试更改目录权限if(!chdir.empty())chmod(chdir.c_str(),0777);// chmod 需要传递权限值参数,这里假设为 0777// 打开 /dev/null 设备文件,以只读方式打开int fd =open(nullfile.c_str(), O_RDONLY);if(fd >0){// 将标准输入、输出和错误输出重定向到 /dev/nulldup2(0, fd);// 将标准输入(fd 0)重定向到 /dev/nulldup2(1, fd);// 将标准输出(fd 1)重定向到 /dev/nulldup2(2, fd);// 将标准错误输出(fd 2)重定向到 /dev/nullclose(fd);// 关闭文件描述符}}
  • 忽略异常信号:守护进程通常不会干扰终端信号,因此忽略了与子进程、管道破裂和停止信号相关的信号。
  • 脱离终端:通过 fork()setsid() 创建一个新的会话,使得守护进程不再受控制终端影响。
  • 修改工作目录:尝试修改工作目录(但代码存在错误,应改为 chdir())。
  • 重定向输入输出:将标准输入、输出和错误输出重定向到 /dev/null,避免进程与终端交互。

Read more

人工智能大模型应用开发:从微调适配到场景落地

人工智能大模型应用开发:从微调适配到场景落地

一、人工智能大模型应用开发:从微调适配到场景落地 1.1 本章学习目标与重点 💡 掌握大模型应用开发的核心流程,包括模型选型、微调适配、功能封装、部署上线等关键环节; 💡 熟练运用主流大模型框架(Hugging Face Transformers、LangChain、LlamaIndex 等),实现文本生成、问答系统、智能助手等常见应用; 💡 理解大模型微调的核心技术(全参数微调、LoRA、QLoRA 等),能够根据数据规模和硬件资源选择合适的适配方案; 💡 通过真实场景案例(企业知识库问答、智能客服、代码生成助手),掌握大模型从技术适配到业务落地的端到端开发能力。 ⚠️ 重点关注:大模型的上下文窗口限制、生成内容的准确性与安全性、微调过程中的显存优化、以及生产环境下的性能与稳定性平衡。 1.2 大模型应用开发基础:选型与环境搭建 大模型应用开发的第一步是明确业务需求,选择合适的模型并搭建稳定的开发环境。本节将从模型选型原则、主流开发框架介绍、环境搭建实操三个维度,为后续开发奠定基础。 1.2.1

By Ne0inhk
实测Gemini Pro:谷歌王牌AI,到底能帮我们解决多少实际问题?

实测Gemini Pro:谷歌王牌AI,到底能帮我们解决多少实际问题?

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一、核心亮点实测:不止是“多模态”,更是“真全能” * 1. 多模态处理:能“看、听、读、写”,还能“联动协作” * 2. 推理能力:复杂问题“会拆解、会纠错”,堪比专业助手 * 3. 代码能力:开发者的“全能帮手”,新手也能轻松上手 * 二、真实应用场景:这些领域,已经在用它提效了 * 1. 科研领域:帮研究员“节省时间”,专注核心工作 * 2. 内容创作:

By Ne0inhk
量化、算子融合、内存映射:C语言实现AI推理的“三板斧“

量化、算子融合、内存映射:C语言实现AI推理的“三板斧“

量化、算子融合、内存映射:C语言实现AI推理的"三板斧" 摘要:做嵌入式AI开发的同学,大概率都遇到过这样的困境:训练好的AI模型(比如CNN),在PC上用TensorFlow/PyTorch跑起来流畅丝滑,可移植到单片机、MCU等边缘设备上,要么内存爆掉,要么推理延迟高到无法使用——毕竟边缘设备的资源太有限了:几百KB的RAM、几MB的Flash、没有GPU加速,甚至连浮点运算都要靠软件模拟。这时,依赖庞大的深度学习框架就成了“杀鸡用牛刀”,甚至根本无法运行。而C语言,作为嵌入式开发的“母语”,凭借其极致的性能控制、内存可控性和无 runtime 依赖的优势,成为边缘设备AI推理引擎的最佳选择。但纯C语言实现AI推理,绝不是简单地“用C重写框架代码”,关键在于掌握三大核心优化技术——这就是我们今天要讲的AI推理“三板斧”:量化、算子融合、内存映射。 它们三者协同作用,能从“体积、速度、内存”三个维度彻底优化AI推理性能:

By Ne0inhk
Python安装与环境配置全程详细教学(包含Windows版和Mac版)

Python安装与环境配置全程详细教学(包含Windows版和Mac版)

Windows版 Python的安装与环境配置 1.下载Python Python下载地址:Download Python | Python.org 可以在这里直接点击下载,就会下载你电脑对应的最新版本 如果你要是不想下载对应的最新版或者因为某些原因你想安装某一特定版本的Python你可以在上面的Downloads中点击Windows 你就可以看到所有版本的Python,其中左边Stable Releases对应的是稳定版,右边Pre-releases对应的是提前测试版不建议下载 下载时记得点击Download Windows installer(64-bit) 现在的电脑一般都是64位了,如果你的电脑不是64位请选择对应版本的进行安装,如果你不确定你的电脑是多少位系统,你可以尝试以下几种方法:首先如果你的电脑系统是Win11那一定是64位,你依然可以从以下途径查看 1.打开设置,点击系统,向下翻找到系统信息,打开后就能清楚看到自己的电 脑是64位处理器的了 2.通过命令行查询,在键盘上同时按住win+r键,然后输入cmd,如图所示,然后按下回车 再输入Syste

By Ne0inhk