linux祖先进程,Linux下的几种特殊进程

1、Linux的登录环境

Linux是一个多任务多用户的操作系统,其设计初衷: 就是要达成多用户同时使用单个计算机大的任务。

多用户:早期计算机资源紧张,为了让更多的人都可以使用。

多任务:服务于多用户,同时提高计算机的吞吐量。

早期登录就是通过哑终端连接登录的。

早期登录Linux模型

345ba1756177621f8ead04d87ee4bc8d.png

随着以太网的发展,Linux的出现,在进行多用户连接时候,充分使用了以太网。提高了应用层的网络服务,这些网络服务替代了之前的轮询监控串口的服务进程。ssh相对于Telnet就是加密了,更加安全。

2、进程组

在Linux下进程除了具有父子关系这样的组织关系以外,还具有分组的组织关系,任何一个进程都需要隶属于某个进程组。

每一个进程组都拥有一个独立的进程组编号,可以通过getpgid()方法得到。

每一个进程组都拥有且只拥有一个组长进程。可以通过该组长管理其组内的其它进程的统一行为。(例如:组长进程若获取一个特殊的信号,该信号可以传递给组内所有进程)。

进程组ID就是该进程组组长的进程ID。

进程组内的成员都是组长的子及子孙。

3、会话

每一个进程除了要归属一个进程组以外,还需要归属于一个会话之中。会话的概念主要是从终端登录到计算机之后得到的。

当一个终端登录到计算机之后,为了方便将不同的终端隔离开,同时又能够充分合理的管理一个终端下产生的所有进程,因此而提出了会话的概念。换句话来说,会话就是用户登录之后从登录服务进程到shell进程所组成的集合。

从逻辑上来讲,会话就控制了计算机和某一个终端的一个连续的交互过程。

一个会话通常是由多个进程组组成的,分为两部分(前台进程组、后台进程组)。

会话具有一个会话首进程。操作系统通过会话的首进程来管理整个会话中的所有进程组。

(1)、前台进程组

是和终端服务进程、bash进程捆绑在一起的,和终端直接相关。那么,终端的任何操作都会影响到所有的前台进程组。

在shell交互环境中执行一个命令,就会产生一个新的进程来执行这个命令,不仅如此,还会产生一个新的进程组,该进程组的组长就是被执行命令而形成的新进程。

前台进程组的最大问题就在于,需要看终端的脸色!终端只需要让进程组的组长停止,其内部的所有进程都会停止。

(2)、后台进程组

断开与终端的关系(并非输入、输出、错误输出关系),进程组关系,不在受制于终端而存在,这种进程与进程组被称之为后台的。

后台进程存在的理由就是,需要常驻内存,提供一个服务。

4、进程组如何创建

创建一个新的进程组的方式有2种,这2种有区别:

(1)、通过调用setpgid()能够将调用该方法的当前进程设置为新的进程组的组长。从而创建一个新的进程。

(2)、通过调用setsid()方法来创建一个新的会话,从而就会出现新的进程组,调用setsid()方法的进程就会成为会话的首进程,新进行组的组长。

5、僵尸进程

在Linux操作系统设计中,要求进程结束的时候需要告知其父进程该进程的结束,父进程也需要知道其子进程结束的状态,这是因为父进程有些时候需要根据子进程结束的状态来作一些后续的操作。

进程的消亡:

(1)、进程调用了exit()方法,通知操作系统内存,当前进程想要结束自己的生命;

(2)、操作系统此时就会立即回收进程的几乎所有的主要内容,然后告知其父进程,它的某一个子进程结束;

(3)、父进程需要明确的答复操作系统内核,已收到子进程结束的消息。否则,操作系统内核会一直保存该将要结束进程的部分PCB信息。同时将进程的状态置为defunct。这就是僵尸进程。

i>、僵尸进程是不能够被直接消除掉的。

ii>、僵尸进程的危害: 占用PCB资源(PID资源)。

iii>、子进程先于父进程结束,父进程没有收尸,就是僵尸进程。

其产生僵尸进程的代码如下:#include

#include

#include

int main(void){

pid_t pid;

pid = fork();

if(pid == 0){

printf("This is child, will finish. pid = %d\n", getpid());

}else if(pid > 0){

while(1){

printf("This is father, run allways. pid = %d childPid = %d\n", getpid(), pid);

sleep(1);

}

}else{

perror("");

}

return 0;

}

运行结果

415e2d44049160cfaa251a0f28df6498.png

9640d59b5dd54b9fd45f3e99ff5baa75.png

如何解决僵尸进程的问题?避免僵尸进程的产生。

解决僵尸进程的根本就在于父进程需要处理子进程的结束。通过调用wait()函数族来进行解决。wait会等待子进程的结束,调用wait的进程会阻塞,直到接受到子进程的结束消息时才会被唤醒。父进程等待子进程的结束消息为SIGCHLD(17)信号。

解决僵尸进程的代码 :#include

#include

#include

int main(void){

pid_t pid;

pid = fork();

if(pid == 0){

int i;

for(i = 0; i 

printf("This is child, will finish. pid = %d\n", getpid());

sleep(1);

}

}else if(pid > 0){

int status;

wait(&status); //很好的处理了僵尸进程。

printf("child has gone, status = %d\n", status);

while(1){

printf("This is father, run allways. pid = %d childPid = %d\n", getpid(), pid);

sleep(1);

}

}else{

perror("");

}

return 0;

}

此时就会造成父进程一开始什么也干不了,只能等待子进程的结束,自己才能开始运行。

僵尸进程的解决其实是进程回收进程。

6、孤儿进程

如果某一个进程的父进程先于自己结束,那么该进程还有父进程吗?必须有,因为在Linux下所有的进程都必须存在于整个进程树之中,不允许完全孤立的存在。

如果发生父进程先于子进程结束的情况,则将子进程过继给编号为1的进程,即就是init/systemd进程。

然而此时该进程的进程组关系已经打乱。它所在的进程组不在是其父进程或祖先进程。因为,此时子进程依然保留之前的进程组信息,但是很显然这个进程组与会话信息已经不对了。

这种进程就是孤儿进程,失去了原有的所有进程组与会话关系的进程。所以也会将init/systemd进程称之为孤儿院进程,因为它收养了很多孤儿。

因为子进程的父进程结束,所以其组的组长的信号就不能够传递给该孩子进程。从而使得该子进程就脱离了原有的进程组关系、脱离了原有的会话关系。虽然它保留了原有的进程组和会话ID,但是已经不起任何作用了。

产生孤儿进程的代码 :#include

#include

int main(void){

pid_t pid;

pid = fork();

if(pid == 0){

while(1){

printf("This is along child, pid = %d, pgid = %d sid = %d\n", getpid(), getpgid(getpid()),

getsid(getpid()));

sleep(1);

}

}else if(pid > 0){

printf("This is father, pid = %d, pgid = %d sid = %d\n", getpid(), getpgid(getpid()), getsid(getpi

d()));

}else{

perror("");

}

return 0;

}

此时孤儿进程产生,将用ctrl+c终止不下来,只能用kill PID进行杀死该孤儿进程了。

7、守护进程

守护一个服务,长期驻留在内存中提供服务,不能够受制于终端。通常指的就是操作系统中的服务进程。这些服务进程通常约定其名称最后一个字母为d。

守护进程的另外一个名字 : 精灵进程(demon)。

如何让一个进程成为守护进程? 让一个进程脱离前台进程组关系即可(这样就可以摆脱终端对它的控制)。

怎样让进程脱离前台进程组? 1)、创建一个新的会话;2)、构成孤儿进程。

通常让这两个步骤都进行。

守护进程的创建过程:pid_t pid;

pid = fork();

if(pid == 0){

setsid();   //产生会话进程

while(1){    //子进程一直在运行,迟早会构成孤儿进程。

...

}

}else if(pid > 0){

...

exit(0);  //父进程结束

}else{

perror();

}

8、僵尸进程和孤儿进程的一个关联

init/systemd又叫做上帝进程,一手创造了操作系统内部的所有的进程以外,还管理了这些僵尸进程,帮助将其清除掉了。

如果一个进程下产生了僵尸子进程,当该进程结束的时候,会将僵尸进程过继给init/systemd进程,然后init/systemd进程发现过继的新子进程是僵尸进程之后,会为其收尸,从而消除掉已经存在的僵尸进程。

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

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

相关文章

@select注解_SSM框架(十三):Spring框架中的IoC(3)新注解,完全摆脱xml文件

spring中的新注解1、Configuration作用:指定当前类是一个配置类细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。2、ComponentScan作用:用于通过注解指定spring在创建容器时要扫描的包属性…

element ui 多个子组件_ElementUI 技术揭秘(2) 组件库的整体设计

需求分析当我们去实现一个组件库的时候,并不会一上来就撸码,而是把它当做产品一样,思考一下我们的组件库的需求。那么对于 element-ui,除了基于 Vue.js 技术栈开发组件,它还有哪些方面的需求呢。丰富的 feature&#x…

arraylist线程安全吗_Java的线程安全、单例模式、JVM内存结构等知识梳理

java技术总结知其然,不知其所以然 !在技术的海洋里,遨游!做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!本篇以一些问题开头,请先不看答案,自己思…

【GitHub精选项目】抖音/ TikTok 视频下载:TikTokDownloader 操作指南

前言 本文为大家带来的是 JoeanAmier 开发的 TikTokDownloader 项目,这是一个高效的下载 抖音/ TikTok 视频的开源工具。特别适合用户们保存他们喜欢的视频或分享给其他人。 TikTokDownloader 是一个专门设计用于下载 TikTok 视频的工具,旨在为用户提供一…

python的界面文字翻译_一个把网站全英文转成中文的方法,让你轻松看懂python官网...

近日,在看python官网(英文网站)时,使用了有道翻译工具查看了几个专有名词。无意间,有了是不是可以输入网站地址进行翻译的想法,翻译后的网站地址点击进去后,又是一个什么情况呢?小编…

drools规则引擎技术指南_物联网规则引擎技术

物联网应用程序设计与典型的IT解决方案大不相同,因为它将物理操作技术(OT)与传感器、致动器和通信设备连接起来,并将数字信息技术(IT)与数据、分析和工作流连接起来。在企业环境中,物联网非常复…

linux 2G内存够用吗,不管2G还是6G运存,为什么使用手机时都会先占用一半?

原标题:不管2G还是6G运存,为什么使用手机时都会先占用一半?以前安卓手机最大的缺陷就是运存问题,手机玩着玩着突然就运行内存不足了,为了运行更流畅手机运存从1G到2G…到8G,手机运存越来越大。但大家有没有…

c++ 写x64汇编 5参数_怀念9年前用纯C和汇编写的入侵检测软件

在翻出12年前用C#写的自我管理软件之后,进一步激发了本猫的怀旧情怀。上一篇在此:竟然无意间翻出12年前自己用C#写的程序这不,昨天竟然又找出2010年写的一款Windows系统入侵检测及防御小工具,当时命名是:NtInfoGuy!对于Windows的内部&#xf…

python怎么导入os模块_python之os模块

在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这就依赖…

ubuntu复制文件到另一个文件夹_简单介绍一下电脑中的文件或文件夹的复制、移动及删除的操作方式...

大家好,我是波仔,今天又来跟各位学电脑基础的朋友们分享知识,让我们一起来学习吧。复制文件或文件夹在我们日常操作文件或文件夹的过程中,经常会遇到需要复制一些文件或文件夹什么的,下面我们就一起来分享一下常用的几…

Windows和linux提权方法,Windows与Linux本地用户提权体验(一)

无论是Windows系统还是linux系统都是基于权限控制的,其严格的用户等级和权限是系统安全的有力保证。这么严密的用户权限是否不可逾越呢?下面笔者反其道而行之进行Windows及Linux下的提权测试。一、windows下获取至高权限大家知道,在Windows系统中SYSTEM…

三相逆变器双pi控制器参数如何调节_光伏逆变器短路特性简析

1前言短路故障相对于其他故障类型来说是比较常见的,不同的设备的短路故障,大了讲都一样,细了说各有千秋,今天我们主要聊聊光伏逆变器的短路特征。电力系统中的电源,传统意义是指的是并入电力系统的同步发电机。但随着分…

linux安装多路径报错,Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)...

Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)猫先生 • 2019 年 06 月 01 日一,安装软件1,执行以下命令,检查当前系统中是否已经安装多路径工具:rpm -qa | grep device-mapper-multipathSuSE 系统 multipath 相关…

net framework 3.5 安装错误_PageAdmin CMS建站系统报http403错误的解决方案

pageadmin CMS目前已经是国内用户最多的网站内容管理系统,但是很多新手第一次安装时候最常见的错误就是http403错误。针对这个错误,小编我整理出了常见的原因及解决方法原因1、后台站点绑定的域名和当前打开的域名不一致。解决办法:重装PageA…

java进程内存一直没释放_五分钟彻底搞懂你一直没明白的Linux内存管理

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内核态和用户态…

ehcache使用_Mybatis整合(Redis、Ehcache)实现二级缓存,恕我直言,你不会

目的:Mybatis整合Ehcache实现二级缓存Mybatis整合Redis实现二级缓存Mybatis整合ehcache实现二级缓存ssm中整合ehcache在POM中导入相关依赖org.springframework spring-context-support ${spring.version}org.mybatis.caches mybatis-ehcache 1.1.0net.s…

取证 c语言实现日志导出_日志与日志不一样:五种不能忽略的日志源

给日志源分出主次大有利于开展有效事件响应。就像分诊护士一样,安全人员也必须给数据分出个优先主次,以帮助他们更好地识别问题,使公司企业及其数据和设备能够避免入侵者和网络攻击的伤害。但是,记录和监视IT环境中的所有相关事件…

codesoft指定打印机打印_巧用win32print来控制windows系统打印机并推送打印任务

小爬最近接到的一个需求是:将windows系统下的打印任务批量有序传输给网络打印机,实现批量有序打印。用户先从公司的OA(B/S模式)系统下 打印指定内容的表单以及表单中的附件内容。这个问题可以这样分解:1、抓包,得到OA对应的任务接…

crmeb pc端模板下载_PC端人人影视下载速度如何提高

首先下载最新版本的人人影视我的是这个,右下角版本号1022然后在下载设置那里把连接数调高一点大致就这样我的就是调了一下然后下载速度高了许多,刚开始只有1M左右的速度,现在4,5M每秒

android 编辑自定义可编辑表格,smart 框架 列表 可编辑表格

可编辑表格常用属性colModel: [{label: "主键ID", name: "hellop1",hidden:true},{label: "列明", name: "hellop2",align: "center", editable: true, edittype: text, editrules: { required: true } }editable&#xff1…