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在创建容器时要扫描的包属性…

linux 到文件的最后一行,linux – 将第一行复制到文件中的最后一行

这里的目的是将文件中的第一行复制到最后一行这里是输入文件335418.75,2392631.25,36091,38466,1335418.75,2392643.75,36092,38466,1335418.75,2392656.25,36093,38466,1335418.75,2392668.75,36094,38466,1335418.75,2392681.25,36095,38466,1335418.75,2392693.75,36096,384…

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

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

LinuX编译显示内核配置无效,配置编译内核(Linux kernel)

虽然以前也编译过内核,但是关于内核配置选项特别是有关本机驱动这块还是不熟悉,因为没有通过确定有效的途径知道当前工作正常的内核中到底使用了什么驱动模块来控制硬件,最近看到一本书《Linux kernel in a netshell》,感觉讲的还…

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

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

linux 7查内核,查看CentOS7内核版本及发行版本

原文:https://blog..net/networken/article/details/79771212s1.查看内核版本[rootlocalhost ~]# uname -srLinux 4.15.11-1.el7.elrepo.x86_64[rootlocalhost ~]# uname -aLinux localhost.localdomain 4.15.11-1.el7.elrepo.x86_64 #1 SMP Mon Mar 19 11:46:06 ED…

python下载文件损坏_pythonw.exe停止工作,无法运行IDLE或任何.py文件 - python

此问题与任何代码都不完全相同。我认为我的安装(python 3.3.5)以某种方式损坏。我尝试了卸载和重新安装以及修复,但是没有任何效果。自从我上次运行任何python代码或进行涉及python的操作以来已经有一段时间了,所以我不能说我不小…

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

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

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

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

linux配置redis服务,记一次linux下安装redis, 设置redis服务, 及添加环境变量

一. redis的安装cd /opt # 切换至opt目录下wget http://download.redis.io/releases/redis-3.2.9.tar.gz # 指定版本下载redistar xzf redis-3.2.9.tar.gz …

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

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

linux中在工作空间编译cpp,linux tensorflow2.4.0 c++ 编译

1. bazel 版本要对应tensorflow的要求2.tensorflow 源码3.eigen4.protobuf 版本要对应tensorflow的要求(workspace.bzl 提到了这个要求)源码编译参考:https://blog.csdn.net/luo841297935/article/details/104417495其他1.CMakeLists.txtcmake_minimum_required (VERSION 2.8.8…

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

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

python取列表前几个元素_Python下几种从一个序列中取出元素的方法

使用Python进行数据处理时,有时候会有这样的操作,比如从一个列表或者numpy array中随机取出一个元素,对一个列表中的元素进行shuffle,等等。虽然这些操作也可以通过编写很简短的程序完成,但我们使用Python有一点很重要…

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

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

linux内核关闭网络巨帧xenomai,xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务...

版权声明:本文为本文为博主原创文章,转载请注明出处。如有错误,欢迎指正。1. 引出问题上一篇文章xenomai内核解析--双核系统调用(一)以X86处理器为例,分析了xenomai内核调用的流程,读了以后可能会觉得缺了点什么&#…

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

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

linux7配置网卡绑定,CentOS7双网卡绑定配置

step1:创建绑定文件[rootnode-1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-bond0TYPE"bond"BOOTPROTO"none"NAME"bond0"DEVICE"bond0"IPADDR"192.168.1.20"NETMASK"255.255.255.0"GATEWAY"192.168.1.1&q…

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

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

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

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