孤儿进程与终端的关系

news2024/9/22 3:33:47

孤儿进程与终端的关系

孤儿进程

在本篇文章当中主要给大家介绍一下有关孤儿进程和终端之间的关系。

首先我们的需要知道什么是孤儿进程,简单的来说就是当一个程序还在执行,但是他的父进程已经退出了,这种进程叫做孤儿进程,因为父进程死亡了,因此被叫做孤儿进程。孤儿进程会被进程号等于 1 的 init 进程收养,也就是说他的新的父进程的进程号等于 1,我们可以使用下面的代码进行验证:


#include <stdio.h>
#include <unistd.h>
#include <err.h>

int main()
{
  pid_t pid = fork();
  if(pid == -1)
  {
    perror("fork:");
  }
  printf("pid = %d ppid = %d\n", getpid(), getppid());
  if(pid == 0)
  {
    do
    {
      sleep(1);
      printf("pid = %d ppid = %d\n", getpid(), getppid());
    } while (1);
    
  }

  return 0;
}

上面的程序的输出结果如下所示:

➜  daemon git:(master) ✗ ./orphan.out 
pid = 25835 ppid = 25251
pid = 25836 ppid = 25835
➜  daemon git:(master) ✗ pid = 25836 ppid = 1
pid = 25836 ppid = 1
pid = 25836 ppid = 1
pid = 25836 ppid = 1
pid = 25836 ppid = 1

从上面终端的输出结果我们可以知道当父进程还没有退出的时候,子进程 25836 的父进程号还是 25835,但是当父进程退出之后,子进程的父进程号已经变成了 1 ,也就是 init 进程,这与我们在上面的分析的结果表现是一致的。

孤儿进程组和终端的关系

在前面我们提到了当一个进程的父进程退出之后,这个进程就会变成一个孤儿进程,其实与孤儿进程对应的有一个孤儿进程组,所谓孤儿进程组就是:一个进程组当中的进程要么是孤儿进程,要么父进程也在这个进程组当中,要么父进程在其他的会话当中,满足上述条件的进程组就是孤儿进程组。

事实上内核在一种情况下也会发送 SIGHUP 信号给孤儿进程组,这个情况如下:

  • 父进程程序执行完成退出了,但是子进程还没有结束,而且被挂起了。
  • 当父进程退出的时候,shell 会在他内部维护的作业列表(job list)将退出的作业删除掉。子进程被 init 进程收养变成了孤儿进程,根据上文当中提到了孤儿进程组的概念,这是一个孤儿进程组,因为这个进程组当中的所有进程(如果不是多进程程序,只有一个)的父进程要么退出,要么父进程也在这个进程组当中,要么父进程在其他的会话当中。条件已经满足,因此这个进程组是一个孤儿进程组。
  • 现在有一个问题是,这个被挂起的孤儿进程没有谁去唤醒啊,理论上来说,在父进程退出之前,子进程被挂起,应该是父进程去收拾好这个烂摊子,但是现在父进程退出了,被挂起的孤儿进程没有在运行,那么就一直会占着他对应的系统资源,如果这样的进程过多的话,那么系统的资源将会被消耗殆尽。

因此为了解决这种问题:如果一个进程组变成了孤儿进程组并且拥有已停止执行的成员,比如说被挂起来的进程,那么内核会向进程组中的所有成员发送一个 SIGHUP 信号通知它们已经与会话断开连接了,之后再发送一个 SIGCONT 信号确保它们恢复执行。如果孤儿进程组不包含被停止的成员,那么就不会发送任何信号。

我们可以使用下面的例子去验证这一点:

#define _GNU_SOURCE
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

void sig(int no, siginfo_t *info, void* context)
{
  char s[1024];
  int fd = open("text.txt", O_RDWR | O_CREAT, 0644);
  sprintf(s, "No = %d pid = %d\n", no , info->si_pid);
  write(fd, s, strlen(s));
  close(fd);
  sync();
  _exit(0);
}

int main()
{
  struct sigaction action;
  action.sa_sigaction = sig;
  action.sa_flags |= SA_SIGINFO;
  action.sa_flags |= ~(SA_RESETHAND);
  sigaction(SIGHUP, &action, NULL);
  pid_t pid = fork();
  if(pid == -1)
  {
    perror("fork:");
  }
  if(pid != 0)
  {
    kill(pid, SIGSTOP); // 父进程执行 给子进程发送 SIGSTOP 信号 让子进程停止执行
  }
  else
  {
    while(1); // 子进程执行
  }
  sleep(1);
  return 0;
}

在上面的程序当中,我们 fork 出一个子进程,然后子进程不断的进行死循环,父进程会给子进程发送一个 SIGSTOP 信号,然后子进程会停止执行,因此父进程退出之后,那么子进程就会成为孤儿进程,子进程所在的进程组就会变成孤儿进程组,在这种情况下内核就会发送一个 SIGHUP 信号给这个孤儿进程,同时也会发送一个 SIGCONT 信号,保证孤儿进程在执行,而不是被挂起。我们在终端当中执行上面的程序会发现 text.txt 当中的内容如下所示:

No = 1 pid = 0

pid = 0 表示这个信号是内核发送的,发送的信号为 1 ,对应的信号名字为 SIGHUP,因此这验证了我们在上面所谈到的内容。

孤儿进程组和终端的读和写

在前面的文章当中我们已经谈到了,当后台进程试图从控制终端中调用 read()时将会收到 SIGTTIN 信号,当后台进程试图向设置了 TOSTOP 标记的控制终端调用 write()时会收到 SIGTTOU 信号。但向一个孤儿进程组发送这些信号毫无意义,因为一旦被停止之后,它将再也无法恢复了。基于此,在进行 read()和 write()调用时内核会返回 EIO 的错误,而不是发送 SIGTTIN 或 SIGTTOU 信号。基于类似的原因,如果 SIGTSTP、SIGTTIN 以及 SIGTTOU 信号的分送会导致停止孤儿进程组中的成员,那么这个信号会被毫无征兆地丢弃。这种行为不会因为信号发送方式(如信号可能是由内核产生的或由显式地调用 kill()而发送)的改变而改变。

总结

在本篇文章当中主要给大家介绍了关于孤儿进程和孤儿进程组的相关知识,总体来说比之前的两篇文章相对简单一点。


以上就是本篇文章的所有内容了,我是LeHung,我们下期再见!!!更多精彩内容合集可访问项目:https://github.com/Chang-LeHung/CSCore

关注公众号:一无是处的研究僧,了解更多计算机(Java、Python、计算机系统基础、算法与数据结构)知识。

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

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

相关文章

C#中Convert与强制转换之间的区别

Reference Source Convert与强转最大的区别是 增加了范围校验&#xff0c;如果不在范围内&#xff0c;直接抛出异常 Convert 类 (System) | Microsoft Learn 小数转化为整数 使用基本数据类型强制转化原理&#xff1a;小数转化为整数&#xff0c;舍弃小数点后的所有数字。 …

HTTP响应是什么?

文章目录HTTP响应1. 响应行2. 响应头3. 空行与响应体4. HTTP响应示例HTTP响应 当客户端发起一个请求后&#xff0c;一般都会得到一个服务器的响应&#xff0c;断网或者服务器宕机的情况下除外。服务器发送给客户端的 HTTP 响应用于向客户端提供其请求的资源&#xff0c;以及客…

开源项目-绩效管理系统

开源项目-绩效管理系统 哈喽&#xff0c;今天给大家带来一个开源系统-绩效管理系统 源码下载​​​​​​​ 系统介绍 本系统为绩效考核系统&#xff0c;系统分为三大模块&#xff1a;考核设置&#xff0c;绩效考核&#xff0c;系统管理。 可满足小企业对员工进行考核。本系…

自定义maven骨架的添加与删除——完整详细介绍

目录一、创建好自己所需的目录结构二、命令配置2.1 配置总览2.2 指令配置说明2.3 指令配置详情三、配置Idea中maven新模板3.1 找到信息文件3.2 创建实例模板四、删除自定义模板4.1 删除本地仓库中的文件4.2 删除archetype-catalog.xml文件中的配置4.3 删除idea中的配置一、创建…

傻白入门芯片设计,指令集架构、微架构、处理器内核(十一)

早期计算机出现时&#xff0c;软件的编写都是直接面向硬件系统的&#xff0c;即使是同一计算机公司的不同计算机产品&#xff0c;它们的软件都是不能通用的,这个时代的软件和硬件紧密的耦合在一起&#xff0c;不可分离。 IBM为了让自己的一系列计算机能使用相同的软件,免去重复…

毕业设计-深度学习机器视觉铝型材表面缺陷识别

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

excel表格怎么换行?单元格内换行的4个方法

今天分享一个excel单元格内换行的小技巧&#xff0c;希望对大家有用。我们在编辑excel文本时经常会遇到这样的情况&#xff1a;将文字内容用一种方式快速从中间插入。比如我们在制作表格时&#xff0c;要将区域内的数据全部合并到一张表格中&#xff08;即单元格区域&#xff0…

破茧化蝶,从Ring Bus到Mesh网络,CPU片内总线的进化之路

文章目录**为什么需要片内总线&#xff1f;****星型连接****环形总线&#xff08;Ring Bus&#xff09;****Mesh网络****结论**转载于&#xff1a;https://zhuanlan.zhihu.com/p/32216294 在大多数普通用户眼里&#xff0c;CPU也许就是一块顶着铁盖子的电路板而已。但是如果我…

【基于Tansformer的融合方法:感知损失:传递-感知损失】

HyperTransformer: A Textural and Spectral Feature Fusion Transformer for Pansharpening &#xff08;超级Transformer&#xff1a;一种用于全色锐化的纹理和光谱特征融合Transformer&#xff09; 先看这一篇简单了解Transformer &#xff08;是一篇高光谱图像融合&#x…

[附源码]计算机毕业设计JAVA疫情背景下叮当买菜管理系统

[附源码]计算机毕业设计JAVA疫情背景下叮当买菜管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

postgresql_internals-14 记录

梳理一下之前理解不太清楚的知识点&#xff0c;重点内容可能会再拆出来单独研究。 原书链接&#xff1a;Index of / 一、 数据组织 1. pg系统库 template0&#xff1a;用于从逻辑备份还原&#xff0c;或创建不同字符集的数据库&#xff0c;不可以修改template1&#xff1a;真…

i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

一、概述 Linux 内核编译流程如下&#xff1a; 1、配置 Linux 内核。 2、编译 Linux 内核。 说明&#xff1a;进入 Linux 内核源码&#xff0c;使用 make help 参看相关配置。 二、make menuconfig 工作原理 1、menuconfig 它本身是一个软件&#xff0c;只提供图形界面配…

Android App 秒开实践方案~

一、背景 启动速度可以说是一个 APP 的门面&#xff0c;对用户体验至关重要。随着业务不断增加&#xff0c;需要初始化的任务也越来越多&#xff0c;如果放任不管&#xff0c;启动时长会逐步增加&#xff0c;为此雪球客户端针对应用启动时长做了大量优化工作。本文从应用启动基…

[读论文] Monocular 3D Object Reconstruction with GAN inversion (ECCV2022)

概述 项目主页&#xff1a;https://www.mmlab-ntu.com/project/meshinversion/ 方法名称&#xff1a;MeshInversion 输入&#xff1a;单目图像 &#xff08;in the wild&#xff0c;有背景的&#xff0c;没有抠图的&#xff09; 输出&#xff1a;textured 3D mesh key challen…

【metaRTC学习】metaRTC的demo运行说明(一)

metaRTC的github的地址为&#xff1a;GitHub - metartc/metaRTC: A cross-platform WebRTC SDK 其作者杨高峰的博客为&#xff1a;metaRTC的博客_CSDN博客-metaRTC,解决方案领域博主 其博客对其自己的demo的运行说明不够详细&#xff0c;刚入门的会一脸懵&#xff0c;本文对其…

Netty(二)- NIO三大组件之Buffer

文章目录一、Buffer 基本介绍二、Buffer 类及其子类三、Buffer 的使用四、关于Buffer 的注意事项和细节1. put和get的数据类型应该相同2. 可以将一个普通 Buffer 转成只读 Buffer3. 可以使用MappedByteBuffer让文件直接在内存中修改4. 可以通过 Buffer 数组完成读写操作&#x…

富文本编辑器 ck-editor5 的使用

最近在项目中需要用到富文本编辑器&#xff0c;据说ck-editor5很不错&#xff0c;于是就使用它了&#xff0c;不过在期间也遇到了很多问题&#xff0c;这里记录下。 一、引入ck-editor5 文档地址&#xff1a;Predefined builds - CKEditor 5 Documentation 这里有个坑&#…

YOLOv2-yolo9000-batter,faster,stronger 论文精度

参考大佬&#xff1a;同济子豪兄 YOLOv2-yolo9000 yolo9000-batter,faster,stronger Introduction 我们提出了一种新的方法来利用大量的图像分类数据&#xff0c;来扩大当前检测系统的范围。我们的方法使用目标分类的分层视图&#xff0c;允许我们将不同的数据集组合在一起…

个人需求1:代码提交这块的做法

老早之前的代码提交的步骤&#xff0c;真的是很繁琐在这里提交代码&#xff0c;现在和大家分析一下我当初的心得。 1.首先黄老师建立了一个jira号,记得把功能背景/方案说明/测试范围提前了解,问起来的时候也能回答,如下图1: 15324就是我本次的jira号,每次开发前先建立jira号,这…

小区访客导航GIS方案

1 应用功能设计 1.1 小区地图 1.1.1 小区地图浏览 基于GIS平台&#xff0c;对小区地图进行渲染发布&#xff0c;提供可视化显示浏览地图可以选择2D地图模式&#xff0c;用户可以在地图上快速查询和点击选择某个小区内的建筑物、POI等信息&#xff0c;并查看其相关属性信息&…