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

【Linux取经路】守护进程

在这里插入图片描述

文章目录

  • 一、前台进程和后台进程
  • 二、Linux 的进程间关系
  • 三、setsid——将当前进程设置为守护进程
  • 四、daemon——设置为守护进程
  • 五、结语

一、前台进程和后台进程

image-20240320212621951

Linux 中每一次用户登录都是一个 session,一个 session 中只能有一个前台进程在运行,键盘信号只能发送给前台进程,其中谁拥有键盘文件谁就是前台进程。./process & 表示启动一个后台进程,后台进程和前台进程可以同时向显示器进行打印。

image-20240320213543544

jobs 查看后台进程。

image-20240320213642676

fg 后台任务号 将一个后台进程提到前台。如果 ctrl+z 将一个前台进程给暂停了,那么操作系统会把 bash 提到前台来,并且把暂停的进程放到后台。在命令行中前台进程一定要存在。bg 后台任务号 将一个因为暂停而被放到后台的任务重新启动,启动后是在后台运行。

二、Linux 的进程间关系

image-20240320220016443

其中 PGID 是进程组 ID,一个任务会对应一个进程组,一个任务可能需要几个进程共同来完成。多个任务(进程组),在同一个 session 内启动的,sid 是一样的,该 sid 其实就是操作系统为该会话所创建的 bashpid

image-20240320222509999

我们在 Xshell 上关闭连接(退出登录)后,操作系统并没有把之前登录创建的 session 全部清理掉,没有把该 session 下的后台进程全部终止掉,但是在其他一些操作系统上,例如 Windows ,它的注销功能,就是把当前 session 中的全部进程全部终止。为了避免出现用户退出后,进程被终止,这里引出守护进程的概念,所谓守护进程,就是该进程自成进程组,自成会话

三、setsid——将当前进程设置为守护进程

#include <unistd.h>pid_t setsid(void);
  • 返回值:成功,返回一个新的 sid,一般都是当前进程的 pid。失败,-1被返回,错误码被设置。
  • 注意:调用该函数的进程不能是某个进程组的组长。而我们一般直接在命令行 ./ 执行的某个可执行文件,都是自成进程组的,自己就是进程组的组长,所以要向实现守护进程,非常重要的一步就是 fork 创建子进程,然后让父进程退出,此时子进程的组 ID 就是父进程的 PID,而不是自己的 PID,此时就可以在子进程中调用 setsid 函数。守护进程的本质也是孤儿进程,它会被操作系统领养,但是它为自己创建了一个新的会话(session),此时就不受任何用户登录和注销的影响。

守护进程的过程分为以下四步

  • 忽略其他异常信号

  • 创建子进程,终止父进程,让子进程成为一个独立的会话

  • 更改当前的工作目录

  • 将标准输入、标准输出、标准错误重定向到 /dev/null (相当于一个垃圾箱,输入进程的东西都被丢弃了,并且从里面获取不到任何输入)

// Daemon.hpp
#include <iostream>
#include <signal.h>
#include <unistd.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(SIGCHLD, SIG_IGN); // 17号信号——子进程退出给父进程发送这个信号signal(SIGPIPE, SIG_IGN); // 读端关闭写端正常,操作系统会给写端发送13号信号,终止掉写端signal(SIGSTOP, SIG_IGN); // 暂停信号// 2. 创建子进程,将父进程终止,让子进程变成独立的会话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);}
}

image-20240321101120175

image-20240321102157430

image-20240321103447116

小Tips:一般守护进程的名字都以 d 结尾。

四、daemon——设置为守护进程

daemon 函数是系统为我们提供的将一个进程设置成守护进程的函数。

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

nochdir 为 0 表示将进程的工作目录设置到 / 目录。noclose 表示将标准输入、标准输出、标准错误重定向到 /dev/null 中。

五、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述

相关文章:

【Linux取经路】守护进程

文章目录 一、前台进程和后台进程二、Linux 的进程间关系三、setsid——将当前进程设置为守护进程四、daemon——设置为守护进程五、结语 一、前台进程和后台进程 Linux 中每一次用户登录都是一个 session&#xff0c;一个 session 中只能有一个前台进程在运行&#xff0c;键盘…...

Nginx之文件下载服务器

1.概述 在对外分享文件时&#xff0c;利用Nginx搭建一个简单的下 载文件管理服务器&#xff0c;文件分享就会变得非常方便。利 用Nginx的诸多内置指令可实现自动生成下载文件列表 页、限制下载带宽等功能。配置样例如下&#xff1a; server {listen 8080;server_name localhos…...

OpenCV学习(4.11) OpenCV中的图像转换

1. 目标 在本节中&#xff0c;我们将学习 使用OpenCV查找图像的傅立叶变换利用Numpy中可用的FFT功能傅立叶变换的一些应用我们将看到以下函数&#xff1a;**cv.dft()** &#xff0c;**cv.idft()** 等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用…...

2024.6.13每日一题

LeetCode 子序列最大优雅度 题目链接&#xff1a;2813. 子序列最大优雅度 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个长度为 n 的二维整数数组 items 和一个整数 k 。 items[i] [profiti, categoryi]&#xff0c;其中 profiti 和 categoryi 分别表示第 i…...

Linux命令详解(2)

文本处理是Linux命令行的重要应用之一。通过一系列强大的命令&#xff0c;用户可以轻松地对文本文件进行编辑、查询和转换。 cat&#xff1a; 这个命令用于查看文件内容。它可以一次性显示整个文件&#xff0c;或者分页显示。此外&#xff0c;cat 还可以用于合并多个文件的内容…...

iOS ReactiveCocoa MVVM

学习了在MVVM中如何使用RactiveCocoa&#xff0c;简单的写上一个demo。重点在于如何在MVVM各层之间使用RAC的信号来更方便的在各个层之间进行响应式数据交互。 demo需求&#xff1a;一个登录界面(登录界面只有账号和密码都有输入&#xff0c;登录按钮才可以点击操作)&#xff0…...

图文解析ASN.1中BER编码:结构类型、编码方法、编码实例

本文将详细介绍ASN.1中的BER编码规则&#xff0c;包括其编码机制、数据类型表示、以及如何将复杂的数据结构转换为二进制数据。通过本文的阅读&#xff0c;读者将对ASN.1中的BER编码有一个全面的理解。 目录 一.引言 二.BER编码基本结构 ▐ 1. 类型域&#xff08;Type&#…...

jQuery如何停止动画队列

在jQuery中&#xff0c;你可以使用.stop()方法来停止动画队列。.stop()方法有几个可选的参数&#xff0c;可以用来控制停止动画的方式。 以下是.stop()方法的基本用法和一些参数选项&#xff1a; 无参数&#xff1a;立即停止当前动画&#xff0c;并跳到最后的状态。后续的动画…...

vue3+electron搭建桌面软件

vue3electron开发桌面软件 最近有个小项目, 客户希望像打开 网易云音乐 那么简单的运行起来系统. 前端用 Vue 会比较快一些, 因此决定使用 electron 结合 Vue3 的方式来完成该项目. 然而, 在实施过程中发现没有完整的博客能够记录从创建到打包的流程, 摸索一番之后, 随即梳理…...

oracle常用经典SQL查询

oracle常用经典SQL查询(转贴) oracle常用经典SQL查询 常用SQL查询&#xff1a; 1、查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from dba_tablespaces t, dba_data_files d where t.tablespace_name d.tablespace_name grou…...

Android shell 常用 debug 命令

目录 1、查看版本2、am 命令3、pm 命令4、dumpsys 命令5、sed命令6、log定位查看APK进程号7、log定位使用场景 1、查看版本 1.1、Android串口终端执行 getprop ro.build.version.release #获取Android版本 uname -a #查看linux内核版本信息 uname -r #单独查看内核版本 1.2、…...

Unity3D Shader数据传递语法详解

在Unity3D中&#xff0c;Shader是用于渲染图形的一种程序&#xff0c;它定义了物体在屏幕上的外观。Shader通过接收输入数据&#xff08;如顶点位置、纹理坐标、光照信息等&#xff09;并计算像素颜色来工作。为了使得Shader能够正确运行并产生期望的视觉效果&#xff0c;我们需…...

计算机组成原理(五)

一、链式查询方式 接口的优先级固定不变 在链式查询的情况下&#xff0c;设备的优先级通常与其在链中的位置有关。具体来说&#xff0c;越靠近查询链的起始位置的设备通常具有较高的优先级&#xff0c;而越靠近链的末尾位置的设备优先级较低。 优点&#xff1a; 简单实现&am…...

后端项目实战--瑞吉外卖项目软件说明书

瑞吉外卖项目软件说明书 一、项目概述 瑞吉外卖项目是一个外卖服务平台&#xff0c;用户可以通过该平台浏览餐厅菜单、下单、支付以及追踪订单状态。产品原型就是一款产品成型之前的一个简单的框架&#xff0c;就是将页面的排版布局展现出来&#xff0c;使产品得初步构思有一…...

LeetCode | 27.移除元素

这道题的思路和26题一模一样&#xff0c;由于要在元素组中修改&#xff0c;我们可以设置一个index表示目前要修改原数组的第几位&#xff0c;由于遍历&#xff0c;访问原数组永远会在我们修改数组之前&#xff0c;所以不用担心数据丢失的问题&#xff0c;一次遍历数组&#xff…...

为什么要选择AWS?AWS的优势有哪些?

亚马逊云服务器&#xff08;Amazon Web Services&#xff0c;AWS&#xff09;是全球领先的云计算服务提供商之一&#xff0c;其提供的云服务器是在全球范围内可用的弹性计算服务。对于很多用户来说&#xff0c;他们可能会担心亚马逊云服务器是否会对服务器的使用进行限制。以下…...

【Intel CVPR 2024】通过图像扩散模型生成高质量360度场景,只需要一个语言模型

在当前人工智能取得突破性进展的时代&#xff0c;从单一输入图像生成全景场景仍是一项关键挑战。大多数现有方法都使用基于扩散的迭代或同步多视角内绘。然而&#xff0c;由于缺乏全局场景布局先验&#xff0c;导致输出结果存在重复对象&#xff08;如卧室中的多张床&#xff0…...

postman教程-21-Newman运行集合生成测试报告

上一小节我们Postman Newman的安装方法&#xff0c;本小节我们讲解一下Postman Newman的具体使用方法。 使用Newman运行集合 1、导出Postman集合&#xff1a; 在Postman中&#xff0c;选择你想要运行的集合&#xff0c;然后点击“导出”按钮&#xff0c;选择导出为“Collect…...

基于条件谱矩的时间序列分析(以轴承故障诊断为例,MATLAB)

谱矩方法可以对数据的表面形貌做较为细致的描述&#xff0e;它以随机过程为理论基础&#xff0c;用各阶谱矩及统计不变量等具体的参数表征表面的几何形态&#xff0c;算术平均顶点曲率是一种基于四阶谱矩的统计不变量。 鉴于此&#xff0c;采用条件谱矩方法对滚动轴承进行故障诊…...

ArcGIS Pro 3.0加载在线高德地图

1、打开ArcGIS Online官网&#xff0c;登录自己的账号&#xff0c;登录后效果如下图所示 官网地址&#xff1a;https://www.arcgis.com/home/webmap/viewer.html 2、点击Add&#xff0c;选择Add Layer from Web&#xff0c;如下图所示 3、在显示的Add Layer from Web页面内&am…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一&#xff0c;是基于哈希表的Map接口非同步实现。它允许使用null键和null值&#xff08;但只能有一个null键&#xff09;&#xff0c;并且不保证映射顺序的恒久不变。与Hashtable相比&#xff0c;Hash…...

【向量库】Weaviate概述与架构解析

文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧&#xff1a;Search Process&#xff08;搜索流程&#xff09;3.3. 右侧&…...

Linux实现线程同步的方式有哪些?

什么是线程同步&#xff1f; 想象一下超市收银台&#xff1a;如果所有顾客&#xff08;线程&#xff09;同时挤向同一个收银台&#xff08;共享资源&#xff09;&#xff0c;场面会一片混乱。线程同步就是给顾客们发"排队号码牌"&#xff0c;确保&#xff1a; 有序访…...