进程,会话,守护进程

news2025/5/14 20:53:39

会话

在Linux中,会话(session)是一组相关联的进程的集合,它们可以接收相同的信号,并且通常由一个领导进程来控制。会话中的所有进程都共享同一个控制终端(controlling terminal),这个终端通常是会话的首个进程(也就是会话期领导者进程)打开的终端。

当用户登录到系统时,通常会启动一个新的会话。会话期领导者进程通常是登录shell,它负责启动其他进程并创建新的进程组和会话。如果会话期领导者进程退出,那么整个会话将结束并且该会话中的所有进程都将收到 SIGHUP 信号(默认行为是终止进程)。

会话还有一个与之相关的概念:作业(job)。作业是指在同一会话中的一组相关进程。在交互式shell中,通常可以使用前台作业(foreground job)和后台作业(background job)来管理正在运行的进程。

proc1|proc2 &

这个命令是Linux下的一个管道(pipe)和后台运行(background)的组合操作。

将两个进程proc1和proc2通过管道连接起来,使得proc1的输出可以传递给proc2进行处理。在命令结尾处添加“&”符号表示让整个命令在后台运行,即不阻塞当前shell终端,并且可以同时在该终端中输入其他命令。

具体来说,当执行该命令时,shell会首先创建一个新的子进程来执行proc1和proc2的管道操作,然后立即返回到shell提示符下等待输入新命令。由于该命令在后台运行,因此控制权立即被交还给用户,而不必等待命令执行完毕。至于管道操作的结果,则会显示在标准输出中或者被重定向到其他文件中,具体取决于命令的具体形式。

需要注意的是,如果在后台运行的命令产生了输出,那么它们的输出可能会与用户输入的其他命令的输出混合在一起,因此需要小心处理。此外,也可以使用jobs命令查看当前正在后台运行的任务的状态,并且可以使用fg或bg命令将前台作业切换到后台或反之。

$proc3|proc4|proc5

这个命令看起来是在使用三个进程:proc3、proc4和proc5。

这个命令可能使用了竖杠符号“|”,在基于Unix的操作系统中,“|”符号通常表示管道。管道允许将一个进程的输出作为另一个进程的输入。

根据这个假设,这个命令将 proc3 的输出通过管道传递给 proc4,然后将 proc4 的输出通过管道传递给 proc5。这可以用于链接命令并执行更复杂的操作。

在这里插入图片描述
会话的一些特征

在Linux系统中,会话通常指一个用户与系统交互的过程。Linux的会话具有以下一些特征:

  1. 登录:会话开始于用户登录系统之后,在终端或者远程终端运行shell程序。

  2. 进程组和作业控制:在一个会话内,多个进程可以组成进程组,而进程组又可以被分为不同的作业。Linux提供了作业控制机制,允许用户对作业进行管理。

  3. 控制终端:一个会话通常与一个控制终端相关联。控制终端是用户输入和输出的接口,也是信号传递的媒介。

  4. 会话和进程的关系:在Linux中,每个进程都属于一个会话,而会话又包含了多个进程。当父进程创建一个子进程时,子进程会自动成为父进程所在会话的成员。

  5. 信号:在Linux系统中,进程间通信主要依靠信号。在一个会话中,进程可以向会话内其他进程发送信号,以实现相应的交互。

  6. 生命周期:一个会话的生命周期从用户登录开始,到用户退出系统结束。在此期间会话中的进程可以执行各种操作,并且可能会产生不同的事件和状态。

守护进程

守护进程(daemon)是在后台运行的一种特殊类型的进程,它们通常在系统启动时启动,并在系统关闭时终止。守护进程不与任何控制终端相连,因此它们不能从终端接收输入或向终端输出数据。

守护进程通常被用来执行一些需要在后台长时间运行的任务,例如网络服务、系统监控、日志记录等。它们可以周期性地执行一些任务,或者根据需要启动和停止其他进程。

一个好的守护进程应该有以下几个特点:

能够在后台默默地工作,不会占用用户的交互式控制终端。

能够自我管理并保证稳定性,能够处理各种异常情况,如资源不足、网络中断等。

能够记录所有重要事件以及错误信息,便于管理员进行故障排除和系统调试。

能够按需启动、停止或重启其他进程,实现某些功能,如更新配置文件、重新加载模块等。

总之,守护进程是Linux/Unix操作系统中非常重要的一部分,它们可以为系统提供各种服务和支持,保持系统安全、稳定和高效运行。
要创建守护进程,一般需要按照以下步骤进行:

  1. 创建一个子进程,并使父进程退出。这可以通过调用fork()系统调用来实现。

  2. 子进程调用setsid()系统调用创建一个新的会话并成为新会话的领导进程,从而脱离当前控制终端和进程组的关系。

  3. 将工作目录切换到根目录,以使守护进程不再依赖于任何文件系统。

  4. 关闭所有文件描述符,包括标准输入、标准输出和标准错误输出,避免干扰其他进程或收到不必要的信息。

  5. 重新打开标准输入、标准输出和标准错误输出,将它们指向/dev/null设备,以确保所有输出都被丢弃,不会对其他程序产生影响。

  6. 在守护进程中执行需要的任务,例如接受网络请求、执行系统监控等。

下面是一个简单的创建守护进程的代码示例:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

int main() {
    pid_t pid;
    int fd;

    // 1. 创建子进程并退出父进程
    if ((pid = fork()) < 0) {
        perror("fork error");
        exit(1);
    } else if (pid != 0) {
        exit(0);
    }

    // 2. 子进程创建新会话并成为领导进程
    if (setsid() < 0) {
        perror("setsid error");
        exit(1);
    }

    // 3. 切换工作目录到根目录
    if (chdir("/") < 0) {
        perror("chdir error");
        exit(1);
    }

    // 4. 关闭所有文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 5. 重新打开标准输入输出并重定向到/dev/null
    fd = open("/dev/null", O_RDWR, 0);
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    if (fd > STDERR_FILENO) {
        close(fd);
    }

    // 6. 在守护进程中执行任务
    while (1) {
        // do something...
    }

    return 0;
}

这个例子中,我们创建了一个子进程,并调用setsid()系统调用将其设置为新会话的领导进程。然后,我们切换当前工作目录到根目录以避免依赖于任何文件系统。接着,我们关闭所有文件描述符,包括标准输入、标准输出和标准错误输出,避免干扰其他进程或收到不必要的信息。最后,我们重新打开标准输入、标准输出和标准错误输出,并将它们重定向到/dev/null设备,以确保所有输出都被丢弃,不会对其他程序产生影响。最后,在守护进程中执行需要的任务,例如接受网络请求、执行系统监控等。

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

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

相关文章

DS3800HPIB 有效执行任务的所有程序

DS3800HPIB是通用电气公司生产的Speedtronic Mark IV系列的一部分。这DS3800HPIB是一种大型电路板&#xff0c;具有八个连接端子&#xff0c;电路板两侧的尺寸各不相同。左下角有一个红色小方块&#xff0c;上面有一个拨动开关。这DS3800HPIB有大约50个天蓝色的小二极管。这DS3…

Jetpack Compose中使用MD样式组件Scaffold及导航底部菜单的实现

Compose给我们提供了一个Material Design样式的首页组件(Scaffold),我们可以直接套用从而完成一个APP的首页界面 由于Scaffold中还包含有其他的组件,所以讲解Scaffold先讲解前置的一些组件 TopAppBar 首先,便是TopAppBar,其本质就是我们Android原生常见的Toolbar,不过其封装的…

Java日常练习—类与对象

习题一&#xff1a; 设计Circle类 【问题描述】用面向对象方法设计Circle类&#xff0c;求面积和周长。并设计测试类&#xff0c;输入半径&#xff08;double型&#xff09;&#xff0c;可输出面积和周长。 PI用Math类中的PI.结果保留3位小数 【输入形式】输入半径值&#x…

acwing提高——BFS的Flood Fill和最短路模型

Flood Fill 1.Lake Counting 题目http://ybt.ssoier.cn:8088/problem_show.php?pid1249 自己写的&#xff08;好理解&#xff09; #include<bits/stdc.h> using namespace std; typedef pair<int,int> PII; const int N120; int n,m; char a[N][N]; bool st[N]…

Prompt合集

作者 来自&#xff1a;f Prompt主要内容 我想让你充当「英语翻译员」、「拼写纠正员」和「改进员」。 我会用任何语言与你交谈&#xff0c;你会检测语言&#xff0c;翻译它并用我的文本的更正和改进版本用英语回答。 我希望你用更优美优雅的「高级英语单词」和句子替换我简化…

【EMC专题】为什么PCB上的单端阻抗控制在50欧?

每当我们在发板后和PCB板厂沟通说有些走线需要阻抗控制,控制在多少多少。其实我们所说的阻抗是传输线的特性阻抗。特性阻抗是不能用万用表测量出来的,他由传输线的结构以及材料决定,与传输线的长度、信号的幅度、频率等均无关。 特性阻抗的概念 当电磁波在电缆上…

【Unity100个实用小技巧】保证原图片的情况下,动态扩展图片尺寸

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#…

Kafka 原理温故之数据存储格式

背景 周末看系统架构的时候&#xff0c;看到一致性要求时&#xff0c;回忆了一下 Kafka 的消息一致性保障机制&#xff0c;顺便复习了一下 Kafka 的基础信息。 消息文件目录 Kafka 的消息存储目录是由 server.properties 文件的 log.dirs/tmp/kafka-logs 设置的&#xff0c;…

轻量应用服务器腾讯云和阿里云哪家更好?

轻量应用服务器阿里云和腾讯云哪个好&#xff1f;云服务器吧认为腾讯云轻量应用服务器还不错&#xff0c;腾讯云轻量服务器30元起&#xff0c;配置可选2核2G3M、2核2G4M、2核4G5M、4核8G12M、8核16G18M和16核32G28M&#xff0c;阿里云轻量应用服务器配置仅可以选择2核2G3M和2核…

c++对象中动态内存分配

c对象中动态内存分配 假设我们有两个类&#xff0c;一个是电子表格单元格类SpreadsheetCell&#xff0c;另外一个是电子表格类Spreadsheet。我们都使用过电子表格&#xff0c;一个电子表格往往都有行与列组成。所以我们的Spreadsheet类是SpreadsheetCell类的二维数组。 下面我…

MySQL—系统管理

文章目录 一、系统数据库二、常用管理工具mysqlmysqladminmysqlbinlogmysqlshowmysqldumpmysqlimport/source 一、系统数据库 MySQL安装后&#xff0c;默认会带4个数据库&#xff1a; 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息 &#xff08;时区、主从、用户、…

【CAN卡通信的下位机-STM32cubeIDE-hal库+STMF4xx+数据发送和接收+中断接收方式+基础样例(2)】

【CAN卡通信的下位机-STM32cubeIDE-hal库STMF4xx数据发送和接收中断接收方式基础样例2】 1、概述2、实验环境3、问题描述4、自我尝试与努力(1)在网上查照相关配置文章&#xff0c;进行配置对比。(2)对比st的官方样例例程。(3)请教大佬&#xff0c;帮忙查看代码和调试。(4)总之…

【数据结构】散列表(哈希表)

文章目录 前言一、什么是散列表二、什么是哈希函数三、下面简单介绍几种哈希函数四、冲突处理散列冲突的方法开放定址法再散列函数法公共溢出区法链地址法 五、代码实现1.哈希函数2.链表和哈希表的创建3.哈希表初始化3.从哈希表中根据key查找元素4.哈希表插入元素5.元素删除6.哈…

100天精通Python(可视化篇)——第85天:matplotlib绘制不同种类炫酷气泡图参数说明+代码实战(网格、自定义颜色、钟型、交互、打卡、动态气泡图)

文章目录 专栏导读1. 气泡图介绍1&#xff09;介绍2&#xff09;参数说明 2. 普通气泡图3. 网格气泡图4. 自定义气泡图颜色5. 不同颜色气泡图6. 钟型气泡图7. 交互气泡图8. 打卡气泡图9. 动态气泡图 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到…

实战打靶集锦-020-Tre

提示&#xff1a;本文记录了博主一次艰难又失败的提权经历 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Apache探查4.1.1 adminer.php4.1.2 /cms/目录4.1.3 /info.php页面4.1.4 nikto扫描4.1.5 dirb扫描4.1.6 登录Adminer 5. 提权5.1 系统信息枚举5.2 定时任务枚举5…

SocketTools 11在所有HTTP客户端组件支持

SocketTools 11在所有HTTP客户端组件支持 在所有HTTP客户端组件中添加了对HTTP/2.0协议的支持。 更新了TLS 1.2(及更高版本)和SSH 2.0的安全选项&#xff0c;以使用Microsoft Windows 11和Windows Server 2022中提供的密码套件。较旧、安全性较低的密码套件已被弃用&#xff0…

21级计组硬件实验三-八位串行加法器验证

问题1&#xff1a; 小明同学正在做【半加器、全加器与八位串行加法器实验】&#xff0c;他画好了电路图&#xff0c;但还有不少困难&#xff0c;现在他求助于你&#xff0c;请你帮他解决。 答&#xff1a;选A 注释&#xff1a;A是与门&#xff0c;B是或门&#xff0c;C是同…

【cmake】cmake 实现交叉编译

在PC上开发时&#xff0c;我们可以直接在PC端编译、链接、运行&#xff0c;但是到了嵌入式环境&#xff0c;由于嵌入式的设备资源&#xff08;CPU、RAM&#xff09;无法和PC端相比&#xff0c;如果项目比较复杂&#xff0c;很难甚至不可能在设备上编译。因此&#xff0c;我们一…

vue diff算法与虚拟dom知识整理(9) 手写patch递归子节点上树,用自己写的patch实现虚拟节点替换

上文 我们做到让一个文字虚拟节点上树 但子节点显然还 没有完成 那这次我们继续 递归的话 我们需要换个思路 我们将 src下的入口文件 index.js代码改成这样 import h from "./snabbdom/h"; import patch from "./snabbdom/patch";const container docum…

Apache Zeppelin系列教程第七篇——运行paragraph的整个流程分析

Zeppelin运行paragraph的整个流程分析 前文分别讲述了&#xff0c;JdbcInterpreter、Interpreter、Zengine的流程&#xff0c;本文来主要串联起来paragraph的整个流程 前端 首先前端部分点运行的时候是通过websocket向后端发送请求的zeppelin-web/src/components/websocket/…