Linux--守护进程与会话

news/2024/9/19 6:51:32 标签: linux, java, 运维

进程组

概念

进程组就是一个或多个进程的集合
一个进程组可以包含多个进程。

下面我们通过一句简单的命令行来展示:
在这里插入图片描述

为什么会有进程组?

  • 批量操作:进程组允许将多个进程组织在一起,形成一个逻辑上的整体。当需要对多个进程执行相同的操作时,可以通过进程组进行操作实现,不用对每一个进程执行相同的操作,这样大大提高执行效率。
  • 任务控制:在Linux操作系统中,进程组与作业控制紧密联系。用户可以通过作业控制指令来管理进程组中的进程,从而实现任务的启动、暂停、恢复、停止等功能。
  • 功能联系:进程组中的进程通常在功能上都有相近的联系,它们协同工作完成特定任务。通过进程组可以快速的管理和这些具有共同目标的进程。

如果只有一个进程,是否有进程组?

在这里插入图片描述

组长进程

每一个进程组都有一个组长进程,这个进程的PID与进程组ID一样

  • 作用:进程组组长可以创建一个进程组
  • 生命周期:从进程组创建存在到其中一个最后进程离开为止。

会话

概念

由多个进程组组成的集合,称为会话(session ID)
它提供了一个运行环境和资源共享的上下文,包含了一组相关的进程,这些进程具有共同的会话标识符(SID)。
像我们通过Xshell打开的一个会话页面,就是一个会话。

我们可以通过命令查看已打开的会话:

ls /dev/pts/ 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

setsid()

setsid() 函数在 Unix 和类 Unix 系统中用于创建一个新的会话(session),并使调用该函数的进程成为新会话的领头进程(session leader)。这通常与创建守护进程(daemon processes)相关,因为守护进程需要独立于任何控制终端运行。

但setsid()被执行时:

  • 创建新的会话:如果调用 setsid() 的进程不是进程组的领头进程,则该函数会创建一个新的会话,并使调用进程成为该会话的领头进程。新会话的会话ID(SID)是该进程的PID。
  • 使调用进程脱离控制终端:如果调用 setsid() 的进程之前有一个控制终端,那么调用之后,该进程将不再具有控制终端。这意味着该进程不再是任何终端进程组的成员,也不再与任何终端相关联。
  • 使调用进程成为新进程组的领头进程:调用 setsid() 会导致调用进程成为一个新进程组的领头进程,该进程组的ID也是该进程的PID。

注意
如果这个进程是进程组的组长,那么将会创建会话失败;为了避免这种情况,可以在子进程里面执行该语句,同时让父进程终止;这样子进程会形成一个孤儿进程,进程ID一定是新分配的,就不会出现错误的情况了。

作业控制

作业是针对用户来讲,用户完成某项任务而启动的进程,一个作业既可以只包含一个进程,也可以包含多个进程,进程之间互相协作完成任务, 通常是一个进程管道。

Shell 分前后台来控制的不是进程而是作业 或者进程组。一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell 可以同时运⾏一个前台作业和任意多个后台作业,这称为作业控制

例如:
在这里插入图片描述
在这里插入图片描述

守护进程

在一个会话中,会有一个进程是用来创建对应的会话,这个进程与会话对应的,这个进程被称为守护进程
守护进程(Daemon Process)或称为服务进程,是在Unix、Linux及类Unix操作系统中运行的一种特殊类型的后台进程。守护进程独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程通常在系统启动时由系统初始化脚本启动,并在系统关闭时关闭。它们没有控制终端,因此它们不能接收来自终端的输入,也不能在终端上显示输出。

主要特点

  • 在后台运行:守护进程在后台运行,不占用任何终端。
  • 独立于终端:守护进程与启动它的终端无关,即使启动它的终端被关闭,守护进程仍然运行。
  • 周期性地执行某些任务:守护进程可以定期执行特定的任务,如检查系统状态、备份数据等。
  • 响应系统事件:守护进程也可以监听系统事件,并在事件发生时执行相应的操作。

代码演示如何创建一个会话

Deamon.hpp

#pragma once

#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

const char *root = "/";             // 路径
const char *dev_null = "/dev/null"; // 重定向到哪里

void Deamon(bool ischdir, bool isclose)
{
    // 1. 忽略可能引起程序异常退出的信号
    signal(SIGCHLD, SIG_IGN); // 忽略到子进程创建的信号
    signal(SIGPIPE, SIG_IGN); // 忽略到管道信号

    // 2.创建子进程,关闭父进程
    if (fork() > 0)
        exit(0);

    // 设置让自己成为一个新的会话, 后面的代码其实是子进程在走
    setsid();

    // 是否改变会话路径
    if (ischdir)
        chdir(root);

    //成为守护进程,将对应的标准流进行关闭,表示到后台运行了
    if (isclose)
    {
        close(0);
        close(1);
        close(2);
    }
    else//这里表示重新向到指定目录下
    {
        // 这里一般建议就用这种
        int fd = open(dev_null, O_RDWR);
        if (fd > 0)
        {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    }
}

main.cc

#include "Deamon.hpp"

int main()
{
    Deamon(true,false);
    while(true)
    {
        sleep(1);
    }

    return 0;
}

在这里插入图片描述

将服务器守护进程化

链接:Socket编程TCP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5665177.html

相关文章

02 ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 比特币就仅仅是比特币&#xff1b;以太坊包括以太币&#xff0c;以太币才是和比特币对等的存在。以太坊是可编程的&#xff0c;所以你可以在…

idea使用阿里云服务器运行jar包

说明&#xff1a;因为我用的阿里云服务器不是自己的&#xff0c;所以一些具体的操作可能不太全面。看到一个很完整的教程&#xff0c;供参考。 0. 打包项目 这里使用的是maven打包。 在pom.xml中添加以下模块。 <build><plugins><plugin><groupId>org…

HarmonyOS第一课-应用程序框架基础习题答案

声明&#xff1a;本题库为最新的HarmonyOS第一课的学习题库&#xff0c;仅供参考学习&#xff01; 一、判断题 1. 在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。&#xff08;正确&#xff09; 正确(True) 错误(False) -…

二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)

文章目录 前序遍历&#xff08;迭代法&#xff09;中序遍历&#xff08;迭代法&#xff09;后序遍历&#xff08;迭代法&#xff09;总结 为什么可以用迭代法&#xff08;非递归的方式&#xff09;来实现二叉树的前后中序遍历呢&#xff1f; 在队列与栈专题我们就感受到了&…

html+css+js网页设计 旅游 穷游10个页面

htmlcssjs网页设计 旅游 穷游10个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff…

基于ssm+vue+uniapp的面向企事业单位的项目申报小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引 标记 压缩协同

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Backend - Eclipse 软件写 java 项目

目录 一、下载并安装 1. 下载 2. 下载 java ee packages 3. 创建安装文件夹 二、创建java项目 1. 打开eclipse软件 2. 创建项目 3. 创建包与类 4. eclipse工作目录 三、eclipse基础配置 1. eclipse配置快捷提示 2. eclipse 查看源码配置 3. 浏览目录用树状显示 四…