进程间关系和守护进程

2023-05-16

一、进程间关系

1.进程组(Process Group)
1)是一个或多个进程的集合,通常,这个集合与同一个作业相关联,可以接受同一终端的各种信号。
2)每一个进程组都有一个组长进程,其进程组ID等于其进程组ID。
3)当一个进程组中还有一个进程存在,就算终止了这个组长进程,这个进程组依然存在。
4)我们将一些进程归为进程组的一个重要原因是我们可以将信号发送给一个进程组,进程组中的所有进程都会收到该信号。
这里写图片描述

ps:
    a:列出当前以及其他所有用户的进程。
    x:列出所有有(无)控制终端的进程。
    j:列出所有与作业控制相关的信息。
    //PGID为进程所在的进程组的ID
    //SID是会话ID
    //每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构

2.作业(Job)
1)shell分前后台来控制的不是进程而是作业或进程组
2)一个shell可以运行一个前台作业或多个后台作业,一个前台作业可以由多个进程组成。
3)在前台新起一个作业,shell被提到了后台,但是前台进程退出,shell又会被提到前台,再次等待用户输入命令。
注:作业与进程组的区别?
如果作业中的某个进程又创建了一个子进程,则子进程不属于作业,但属于进程组。进程组范围更广。倘若此时进程退出,shell就被提到了前台,子进程被放到后台执行,因为这个新起的子进程不属于作业。

//ctrl+c杀掉的不是进程而是作业。
//jobs:查看当前所有作业
//fg 1 :将一号作业放到前台,在按ctrl+z则向所有前台进程发送SIGTSTP,默认动作是使进
    程停止,cat继续以在后台作业的形式存在。
//bg 1 :将一号作业放到后台。可以将某个停止的作业在后台继续运行。
//后台作业可以写。

4)与作业控制有关的信号
这里写图片描述

3.会话(Session)
1)概念:一个或多个进程组的集合。
2)一个会话可以有一个控制终端。
3)建立与控制终端连接的会话首进程称为控制进程。
4)一个会话会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。
5)一个会话中应包括控制进程(会话首进程),一个前台进程组和任意多个后台进程组。
6)会话主要是针对一个终端建立的。当我们打开多个终端窗口时,实际上就创建了多个终端会话。
7)无论何时键入中断键,都会将中断信号发送至前台进程组的所有进程

这里写图片描述
——————————————————————————————————————————————————————
这里写图片描述
注:

1.每打开一个终端,就新建一个会话。
2.-bash代表当前终端是从网络中登陆的。
3.bash解释器。

二、守护进程

1.概念
守护进程也叫精灵进程,是运行在后台的一种特殊进程,独立于控制终端。Linux中的大多数服务器就是用守护进程实现的。如ftp服务器、ssh服务器、httpd。守护进程也会完成许多系统任务。
Linux系统启动时,会启动很多的系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登录或运行时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响。一直运行。

大多数守护进程都以超级用户特权运行,所有守护进程都没有控制终端,其终端名设置为问号

2.查看守护进程

ps axj | more
//more类似cat,以一页一页的形式展示,按空格键到下一页。

这里写图片描述
1)TPGID:前台进程组ID,只要是-1,就说明是守护进程,是没有控制终端的进程。
2)COMMAND:命令的名称和参数,一般[]括起来的是内核线程,没有用户空间代码,没有程序文件名和命令行,通常名字采用以k开头,表示kernel
3)udevd:用于维护设备文件,acpid负责电源管理,syslogd负责维护日志文件。
4)守护进程通常采用以d结尾的名字,表示Daemon。
注:守护进程本身也是孤儿进程,守护进程自成进程组,自成会话。0号进程是所有进程的祖先。

3.创建守护进程
1)调用umask将文件模式创建屏蔽字设置为0。
2)调用fork,然后使父进程exit。这样做有两个好处。第一,保证了子进程获得了一个新的进程ID,肯定不是一个进程组的组长进程。第二,当父进程退出时,shell认为这条命令执行完毕,shell被提到了前台,子进程进入后台运行。
3)调用setsid创建一个新会话,使调用进程成为新会话的首进程,并成为一个新进程的组长进程,没有控制终端。
4)将当前工作目录更改为根目录。因为原本的守护进程在系统在引导之前是一直存在的。
5)关闭不在需要的文件描述符,文件描述符也是一种资源,况且守护进程也不需要控制终端。

#include <unistd.h>
pid_t setsid(void);
//函数调用成功,返回新创建的Session的id,出错返回-1。
//注:在调用这个函数之前,当前进程不允许为进程组的组长进程

实现代码:

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

void mydaemon(void)
{
    int fd0;
    pid_t pid;
    struct sigaction sa;
    umask(0);
    if((pid=fork())<0)
    {
        perror("fork");
        return;
    }
    else if(pid>0)
    {
        exit(0);
    }
    setsid();  //创建一个新会话。
    sa.sa_handler=SIG_IGN;//当接收到SIGCHLD信号时,默认处理动作为忽略。
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;
    if(sigaction(SIGCHLD,&sa,NULL)<0)  //使注册子进程退出忽略信号
    {
        return;
    }
    if(chdir("/"<0))  //将子进程的目录改为根目录
    {
        printf("child dir error");
        return;
    }
    close(0);
    close(1);
    close(2);
    //fd0=open("/dev/null",O_RDWR);
    //dup2(fd0,1);
    //dup2(fd0,2);
    //关闭文件描述符,或者重定向到/dev/null
}

int main()
{
    mydaemon();
    while(1)
    {
        sleep(1);
    }
    //守护进程一直运行。main程序进入了休眠状态。
}

这里写图片描述
注:也可以使用系统函数daemon来创建一个精灵进程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程间关系和守护进程 的相关文章

  • C++11 非常方便的特性

    文章目录 C 43 43 11一 nullptr1 含义2 作用3 NULL存在的问题 二 auto1 含义2 限制3 使用场景 三 lambda1 含义2 优点3 用法 四 基于范围的for循环1 作用2 用法3 循环内更改数组 C 43
  • QML入门----C++与QML交互快速应用

    文章目录 前言一 Qt中有关QML的C 43 43 类1 QQmlEngine2 QQmlContext3 QQmlComponent4 QQmlExpresssssion 二 其他1 使用C 43 43 属性 xff08 Q PROPER
  • QML错误:Component is not ready

    一 原因 终极原因 xff1a 组件没有构建好 xff0c 有可能是加载的QML路径不对 xff0c 或者是QML代码错误 xff0c 或者是QML组件还没有加载完 二 解决办法 打印详细错误 QQmlEngine engine span
  • QT 打开程序闪烁cmd窗口

    包含多种原因 xff0c 我的原因是Pro文件多写了一些其他的 xff0c 删除了下面这句OK了 DISTFILES span class token operator 43 span span class token operator 6
  • QT UTC(T和Z格式)时间转换为北京时间

    一 UTC 协调世界时 xff0c 又称世界统一时间 世界标准时间 国际协调时间 由于英文 xff08 CUT xff09 和法文 xff08 TUC xff09 的缩写不同 xff0c 作为妥协 xff0c 简称UTC 和北京时间相差八小
  • QT 文件操作大全

    文章目录 常用文件模式一 创建文件二 读文件三 写文件四 清空文件夹五 计算文件夹个数六 计算文件夹总大小七 转换大小为B KB M G八 批量修改文件名 常用文件模式 模式含义QIODevice ReadOnly只读方式QIODevice
  • QT QScrollArea 滑动到指定item位置

    一 QT自带的api QListWidget QTableWidget QTreeWidget都有自带的api可以调用 xff0c 如下示例 但是当自定义一个QScrollArea区域 xff0c 布局中插入多个item时 xff0c 就需
  • 马克飞象常用操作(markdown )

  • QT 移入控件展示卡片

    功能 xff1a 移入widget显示卡片 xff0c 并且可以进入卡片不消失 xff08 widget与卡片距离离得很近 xff09 xff0c 移出卡片才离开 span class token keyword bool span spa
  • 树莓派pico入门第一站:让主板上的小灯闪起来。(附代码)

    首先配置你的树莓派pico xff0c 把它插在你的电脑上 xff0c 你的电脑会多出来一个 U盘 xff0c 把这个文件复制 xff0c 粘贴 到你的树莓派pico里面 xff0c 你多出来的 U盘 会自动 消失 xff0c 这时候 xf
  • QT 网格布局插入固定列数的item

    一 场景 在网格布局插入固定列数的item xff0c 比如三列item xff0c 根据item的总数计算 span class token macro property span class token directive hash s
  • QT QMetaEnum枚举与字符串互转

    一 示例 span class token macro property span class token directive hash span span class token directive keyword include spa
  • QT 抓取widget转换为图片

    QString folder span class token operator 61 span span class token class name QStandardPaths span span class token operat
  • window11 安装linux子系统(一键安装)并连接到vs code

    文章目录 一 window 使用linux环境的几种方式二 安装wsl1 进入这个目录下 xff0c 将cmd exe已管理员身份运行2 命令行输入以下命令 xff0c 然后重启计算机3 再次已管理员身份打开 xff0c 执行命令 xff0
  • QT 利用URL Protocol实现网页调起本地程序

    一 QT 安装时脚本注入注册表或者自己添加 span class token comment 依次为目录 键 值 xff0c 34 URL Protocol 34 这个键必须有 span WriteRegStr HKCR span clas
  • PC 配置jenkins自动打包

    文章目录 一 下载jenkins运行环境二 下载jenkins三 安装 qt 5 12 2 和 VS 2017四 安装git并配置gitlab五 jenkins配置git 一 下载jenkins运行环境 java jdk 11 镜像下载地址
  • 心系Flyme

    我来自陕西省神木县 xff0c 大学我考入了陕西科技大学 xff0c 成为了一名信息与计算科学专业的学生 xff0c 希望在以后的道路中 xff0c 通过我自己的努力 xff0c 提升自己的价值 在大二大三学习编程 xff0c 希望自己可以
  • C语言的编译链接过程

    编写的一个C程序 xff08 源程序 xff09 xff0c 转换成可以在硬件上运行的程序 xff08 可执行程序 xff09 xff0c 需要进行翻译环境和运行环境 翻译环境则包括两大过程编译和链接 xff0c 经过编译和链接过程便可形成
  • 函数的调用过程(栈帧的创建和销毁)

    为了更好地认识函数的调用过程 xff0c 我们可以用反汇编代码去理解学习 一 基本概念 1 栈帧 xff08 过程活动记录 xff09 xff1a 是编译器用来实现函数调用的一种数据结构 xff0c 每个栈帧对应一个未运行完的函数 xff0

随机推荐

  • 树莓派pico刚买来怎么用?

    第一次使用 xff0c 首先按住主板上的白色按钮 xff0c 然后另一只手把数据线插在主板上 xff0c 直到你的电脑提示有新设备输入 xff0c 提示可以是声音 xff0c 可以是设备管理器多了一个U盘 要想得到提示 xff0c 你要打开
  • C语言动态顺序表

    顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中 xff0c 表可以动态增长 xff0c 尾插元素 xff0c 尾删元素 xff0c 头插元素 xff0c 头删元素 xff0c 打印元素 xff0c 查找元素 xff0c
  • C语言笔记1

    假定程序运行环境为VC6 0 xff0c 缺省为四字节对齐 xff0c CPU xff08 32小字节序处理器 xff09 1 char x 61 34 ab0defg 34 char y 61 39 a 39 39 b 39 39 0 3
  • 【C++三大特性】继承

    如有疑问 xff0c 欢迎讨论 xff0c QQ xff1a 1140004920 一 继承的概念 1 原有的类为基类 xff0c 又称父类 xff0c 对基类进行扩展产生的新类称为派生类 xff0c 又称子类 xff0c 继承可以使代码复
  • C++实现顺序表及双向链表

    顺序表 include lt iostream gt include lt assert h gt using namespace std typedef int DataType class SeqList public 默认的构造函数
  • 二叉树

    一 二叉树 是结点的一个有限集合 xff0c 每个根结点最多只有两颗子树 xff0c 二叉树有左右之分 xff0c 子树的次序不能颠倒 二 二叉树的种类 1 满二叉树 xff1a 每个结点都有左右子树 xff0c 且叶结点都在同一层 2 完
  • 进程间通信----管道、消息队列、共享内存、信号量

    一 进程间通信 xff08 Inter Process Communication xff09 1 目的 1 数据传输 2 资源共享 3 通知事件 4 进程控制 注 xff1a 每个进程都有各自不同的用户地址空间 xff0c 进程之间要交换
  • 进程基本概念、进程地址空间

    强调内容今天来谈一谈进程的一些基本概念 xff0c 认识一些进程状态 xff0c 重新认识一下程序地址空间 xff08 进程地址空间 xff09 xff0c 进程调度算法 xff0c 环境变量等属性 一 进程 1 什么是进程 xff1f 程
  • 何为缓存?

    一 缓存 xff08 cache xff09 1 概念 xff1a 数据交换的缓冲区 xff08 称作Cache xff09 缓存是一块内存芯片 xff0c 具有极快的存取速率 xff0c 它是硬盘内部存储和外界接口之间的缓冲器 xff0c
  • 计算机的组成

    一 冯诺依曼系统 1 计算机硬件 由运算器 控制器 存储器 输入设备 输出设备组成 2 计算机内部采用二进制表示指令和数据 3 注 xff1a 1 输入设备 xff1a 键盘和鼠标等 2 输出设备 xff1a 显示屏 xff0c 打印机等
  • fd与FILE以及fork缓冲问题

    一 文件描述符 fd 1 文件描述符其实就是一个非负的小整数 是文件指针数组的下标 2 让我们看一看0 xff0c 1 xff0c 2 xff0c 代表什么 xff1f span class hljs preprocessor includ
  • Kali Linux使用体验简述

    在以前的版本里Kali Linux默认用户是root用户 xff0c 这样设计的目的是避免每次都要输入root密码 xff0c 而如今需要root密码的程序明显少于从前 xff0c Kali Linux也做出了相应的改革 xff0c 默认用
  • 随身WiFi410的板子刷Debian安装青龙面板+狗东脚本最详细教程

    前几天 xff0c 我发布了一个410刷入debian的教程 很多老哥可能觉得刷入debian没有什么用 xff0c 今天我就教大家如何安装青龙面板 xff0c 并且安装脚本实现自动白嫖狗东的豆子 青龙面板 43 狗东脚本 自动领豆子红包
  • inode以及软硬链接

    一 inode 使用ls l查看文件元数据 xff0c 用来描述数据属性 模式 硬链接数 文件所有组 组 大小 最后修改时间 文件名 使用stat查看 xff0c 查看文件信息 span class hljs comment Access
  • 静态库与动态库

    一 库 由于版权原因 xff0c 库函数的源代码一般是不可见的 xff0c 但在暴露的头文件中你可以看到它对外的接口 库函数简介 xff0c 使用的时候 xff0c 直接引入头文件 include lt gt 即可 二 静态库 1 概念 程
  • 【进程控制上】创建、终止、等待、程序替换

    进程的创建 终止 等待 程序替换 以及popen system与fork之间的区别 一 进程的创建 init进程将系统启动后 xff0c init将成为此后所有进程的祖先 xff0c 此后的进程都是直接或间接从init进程 复制 而来 完成
  • 【进程控制下】实现一个简易的shell

    1 shell原理 运用程序替换的原理来实现的 xff0c shell自己就是一个进程 span class hljs number 1 span 获取命令行 span class hljs number 2 span 解析命令行 span
  • VIM的基本使用

    一 VIM 1 概念 是一款文本编辑器 xff0c 和Emacs并列成为类Unix系统用户最喜欢的文本编辑器 2 优点 可以完成复杂的编辑与格式化功能 3 模式 其模式共有十二种 xff0c 基本模式有六种 span class hljs
  • 进程信号

    一 信号概念 1 一个信号产生及处理实例 1 在shell下 xff0c 启动一个进程 2 按下Ctrl 43 c xff0c 键盘输入产生一个硬件中断 3 如果CPU正在运行这个进程则代码暂停执行 xff0c CPU从用户态返回到内核态
  • 进程间关系和守护进程

    一 进程间关系 1 进程组 xff08 Process Group xff09 1 xff09 是一个或多个进程的集合 xff0c 通常 xff0c 这个集合与同一个作业相关联 xff0c 可以接受同一终端的各种信号 2 xff09 每一个