Linux守护进程

news2025/1/11 10:11:52

"忍耐的灵魂啊,安静地运转吧~"


        我们先来看看这个场景。这是一个常见的基于TCP套接字的网络服务器,服务端接收客户端发送的消息,收到后并向echo回响给客户端。

        对于Linux而言,终端只能有一个前台进程,这也是为什么当我们在服务端一侧启动服务时,继续输入诸如ls\pwd\which等命令时,bash(shell)没有作任何响应。

         现在我们将服务端的窗口关闭后,可以发现的是,客户端就自动退出了。

         这是为什么呢?上述图片描述了什么呢? SID又是什么呢??我们又该如何解决这个问题呢,让我们即便会话窗口退出,也不影响服务器的运行?

——前言


一、 Xshell远端登录和断开做了些什么?

        回答上面的问题并不难,我们使用的Xshell向远端建立链接时,会为用户自动生成一个名为会话的窗口,而SID指的就是会话ID。可以到,图示的打开的三个会话窗口,都具有不同的会话ID。

         

二、 如何理解Linux下的作业?

        我们来看看下面一段代码的例子,使用匿名管道没有别的特殊用意。

sleep 10000 | sleep 20000 | sleeep 30000

         启动程序后面加"&",意味着让该程序启动后,运行在后台。此时我们用jobs可以查看这个工作在后台的进程。

可是我们又该如何理解前、后台进程?

        当我们将上述的三个进程在后台进行运行时,这三个用匿名管道连接起来的进程看似毫不相干,但它们都同属于一个进程组(PGID)! 

        这个代码里创建的所有进程都在"协同"完成一件事情——休眠(sleep)。

        为此,我们把正在执行的一个或多个相关的进程被称为"作业"

         我们输入jobs命令,可以查看后台进程的任务。我们可以通过 fg\bg 命令来回将一个作业进行前、后台状态的切换。

 


       

        对!你上面说的我都理解,当使用Xshell进行远端登录时,会为不同的窗口创建不同的session_Id,而一旦这个会话窗口关闭,其实也就意味着该窗口内运行着的前、后台也会进程关闭。但你还是没有解决服务器不依赖会话的运行的问题。

        

三、 守护进程

(1) 初始守护进程

        守护进程(也叫做精灵进程)deamon,是生存期较长的一种进程,它们常常在系统自举时启动,仅仅在系统关闭时终止。因为它们没有终端,也就意味着它们是运行在后台的。

        在Linux中存在很多守护进程,它们执行事务活动。

        我们使用命令:

-a: 显示由其他用户所拥有的进程状态
-x: 显示没有控制终端的进程状态
-j: 显示与作业有关的信息
ps -axj

        其中有意义的列标为,父进程ID,进程ID,进程组ID,会话ID,终端名称,终端进组ID,用户ID,命令字符串。 

        TPGID为-1的为守护进程。

为什么使用守护进程?

        在linux系统中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端。当用户断开连接,会话关闭,终端关闭后,该终端内的进程也会随之关闭。

        然而,守护进程却可以突破这种限制,因为守护进程是没有终端的。它脱离终端的目的是为了避免进程在运行的过程中的信息,并且进程也不会被任何终端所产生的终端信息所打断。

 

 

       

(2) 守护进程实现

实现流程:

 

实现:

// #pragma once

#include <cstdio>
#include <unistd.h>
#include <cassert>
#include <cstdlib>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define DAEMON_FILE "daemonlog.txt"

void daemonSelf(const char* currPath = NULL)
{
    // 1.创建子进程
    if(fork() > 0) exit(0);

    // 2.另起会话 本质就是一个孤儿进程
    pid_t id = setsid();
    // 断死不会错误
    assert(id != -1);

    // 3.关闭终端 
    // 输出信息到daemonlog.txt
    int fd = open(DAEMON_FILE,O_RDWR);
    if(fd >= 0)
    {
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);

        close(fd);
    }   
    else
    {
        close(0);
        close(1);
        close(2);
    }
    char buffer[] = "dup2重定向完毕\n";
    write(fd,buffer,sizeof(buffer));

    // 4.更改工作路径
    if(currPath) chdir(currPath);

    // 5.文件掩码
    umask(0);

    char buffer2[] = "守护进程创建完成\n";
    write(fd,buffer2,sizeof(buffer2));

}

int main()
{   
    printf("开始创建\n");
    daemonSelf();
    return 0;
}

总结:

        守护进程常常用作服务器进程,一般而言服务器是等待客户进程与其进行联系的一个进程。守护进程在大多数Linux中是一直运行的,因为守护进程没有终端,我们可以选择将进程运行信息通过文件打印出来。

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

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

相关文章

行业唯一丨冠珠出席“中国企业社会责任高峰论坛”,并荣获人民日报社“ESG年度案例”

践行社会责任&#xff0c;推动品牌高质量发展。5月11日&#xff0c;由人民日报社指导、人民日报社经济社会部主办的“中国企业社会责任高峰论坛”在上海盛大举行。 本次论坛围绕乡村振兴、共同富裕、绿色低碳等重点议题进行深入研讨&#xff0c;邀请国家发展和改革委员会、商务…

教程硬货|微信小程序开发之基于vue的微信开发工具JS文件解读(一)

文章目录 1 前言2 前期准备3 微信开发者工具3.1 创建项目3.2 页面介绍 4 读懂Pages4.1 index.wxss4.2 index.wxml4.3 index.json4.4 index.js 5 logs6 小程序的主要文件6.1 app.js6.2 app.json 7 讨论 1 前言 鉴于前段时间出的第一篇记录安装Nodejs和HBuilderX搭建、部署微信小…

【C++】内存分区模型

目录 1、缘起 2、内存分区模型 2.1、程序运行前 2.2、程序运行后 3、总结 1、缘起 前几天学习完了 C 的 基础语法 知识点&#xff0c;现在终于要踏上学习 C 核心编程 的旅程了&#xff0c;期待沿途中所遇到的风景。 2、内存分区模型 C 程序在执行时&#xff0c;将内存大…

【Python Cookie 和代理 IP】零基础也能轻松掌握的学习路线与参考资料

一、Python Cookie 1、什么是Cookie&#xff1f; Cookie是一种在客户端保存数据的机制&#xff0c;服务器通过在HTTP响应头中添加Set-Cookie头实现。浏览器在接收到响应头中的Set-Cookie后&#xff0c;会将这个Cookie保存在本地。之后每次请求都会将本地保存的Cookie自动添加…

WPF插件之 - PropertyChanged.Fody插件的使用详解

总目录 文章目录 总目录一、PropertyChanged.Fody是什么&#xff1f;二、PropertyChanged.Fody的安装三、PropertyChanged.Fody的功能1. 特性1 实现属性通知的功能2 通知其他属性4 不进行属性通知3 指定属性更改时将调用的方法5 设置当前属性依赖的属性6 不检查是否相等7 DoNot…

lua:浅谈对元表和元方法的认识

前言 本篇在讲什么 浅谈对Lua元表和元方法的理解 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Lua5.1的环境 依赖Sublime Text3编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码…

ETCD实现分布式锁

分布式锁具备特点 互斥性&#xff1a;在同一时刻&#xff0c;只有一个客户端能持有锁 安全性&#xff1a;避免死锁&#xff0c;如果某个客户端获得锁之后处理时间超过最大约定时间&#xff0c;或者持锁期间发生了故障导致无法主动释放锁&#xff0c;其持有的锁也能够被其他机制…

ANR实战案例 - FCM拉活启动优化

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Trace日志分析二、业务分析1.Firebase源码分析2.Firebase官方查看官方文档Dem…

数据压缩新利器!小精灵ELF助你高效存储与传输

存储空间不够用&#xff1f;网络传输太慢&#xff1f;想必每个人在生活中都会遇到这些问题。看着爆满的硬盘、焦急的等待数据的接受&#xff0c;更新设备&#xff1f;不是每个人都能承担这个成本。那不如尝试一下无损压缩&#xff1f; 为了减少存储空间的占用&#xff0c;提高…

《Netty》从零开始学netty源码(五十七)之ServerBootstrap.bind()

目录 ServerBootstrap.bind()initAndRegister()init()register()doBind0() ServerBootstrap.bind() 在第一篇的HelloWorld中通过ServerBootstrap.bind()方法绑定端口号并最终启动Netty的服务&#xff0c;服务端的bind过程如下&#xff1a; 上面的代码主要分成两部分&#xff0…

【P20】JMeter XPath提取器(XPath Extractor)

文章目录 一、准备工作二、测试计划 一、准备工作 百度&#xff1a;https://www.w3school.com.cn/example/xmle/cd_catalog.xml 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 如图&#xff0c;使用XPath提取器&#xff08;XPath Extractor&#xff09;获取…

typescript学习笔记(下)

1、类型拓宽 所有通过 let 或 var 定义的变量、函数的形参、对象的非只读属性&#xff0c;如果满足指定了初始值且未显式添加类型注解的条件&#xff0c;那么它们推断出来的类型就是指定的初始值字面量类型拓宽后的类型&#xff0c;这就是字面量类型拓宽。 下面我们通过字符串…

数据结构-排序-(选择、堆排序、归并排序、基数排序)

目录 一、选择排序 二、堆排序 排序 效率分析 三、归并排序 排序 分析 四、基数排序 一、选择排序 思想&#xff1a;每趟在待排序元素中选取关键字最小的元素加入有序子列 不稳定性 空间复杂度&#xff1a;O(1) 时间复杂度&#xff1a; void swap(int &a,int &…

[Linux] 动态 / 静态库的生成与使用

文章目录 简要概念 静态库生成使用 动态库生成使用 简要概念 库一般分为两种&#xff1a; 静态库动态库 在 Linux 中&#xff1a; 如果是动态库&#xff0c;库文件是以 .so 作后缀的如果是静态库&#xff0c;库文件是以 .a 作后缀的 库文件的命名&#xff1a; libXXX.so …

RBTree

目录 红黑树的概念 红黑树性质 红黑树节点设计 红黑树的插入 红黑树的验证 红黑树和AVL树的比较 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的…

Point-SLAM: Dense Neural Point Cloud-based SLAM阅读记录

前言 只读了前半部分就感慨文章结构真的好清晰&#xff0c;从Introduction到related work完完全全都在体现它的motivation——他做了一件什么事情&#xff1f;以及为什么要这么做&#xff1f;解决了什么问题。 第一遍阅读 keywords: 以RGBD作为输入 使用点云表示场景的 dens…

【P21】JMeter XPath2 提取器(XPath2 Extractor)

文章目录 一、准备工作二、测试计划 一、准备工作 百度&#xff1a;https://www.w3school.com.cn/example/xmle/cd_catalog.xml 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 如图&#xff0c;使用XPath2 提取器&#xff08;XPath2 Extractor&#xff09;…

python 使用pandas或xlrd、xlwt实现对Excel的读取、添加、追加等一系列封装

不说了&#xff0c;又是造轮子的一天。在此我要严重批评CSDN或百度一堆浑水摸鱼的&#xff0c;某些人明明代码明显报错也来上传发博客&#xff0c;要么就是标题党&#xff0c;代码没报错但压根就不是实现那个功能的&#xff0c;简直是浪费时间。 废话不多说直接贴代码&#xff…

Linux—网络基础

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 协议报头 局域网通信 网络传输流程图 局域网通信图 跨网络通信图 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址…

8款主流产品原型设计软件分享

在产品设计中&#xff0c;你知道如何选择合适的产品设计软件吗&#xff1f;每个产品设计软件的功能实际上是不同的&#xff0c;不同的产品设计软件应用领域是不同的。 只有深入了解每个产品设计软件的功能和主要适合该软件的行业&#xff0c;我们才能在设计相应的产品时找到合…