浅谈 Linux 孤儿进程和僵尸进程

news2024/11/15 10:45:11

文章目录

  • 前言
  • 孤儿进程
  • 僵尸进程

前言

本文介绍 Linux 中的 孤儿进程 和 僵尸进程。

孤儿进程

在 Linux 中,就是父进程已经结束了,但是子进程还在运行,这个子进程就被称作 孤儿进程

需要注意两点:

  1. 孤儿进程最终会进入孤儿院,也就是被 init 进程接管,子进程死亡后会被 init 进程回收。
  2. 孤儿进程可以使用 kill -9 结束其运行。

代码演示:产生一个孤儿进程

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

/*
 * 代码实现思路:
 *
 * 前面说过,父进程先于子进程结束,那么子进程就是 孤儿进程。
 * 所以我们只需要让父进程创建出子进程后,父进程就结束,子进程继续运行(例如 让子进程进入死循环)
 */

int main() {

        int pid;

        pid = fork();

        if(pid == 0) {
                // 这是子进程
                while(1){
                        printf("我是子进程 id: %d, 我进入了死循环...\n", getpid());
                        sleep(2);
                }
        } else if(pid > 0) {
                // 这段时间让我们用 ps 看看父进程结束前的进程信息
                sleep(10);
                printf("我是父进程, id: %d  没事我先挂了\n", getpid());
        }
        return 0;
}

当运行 test 程序后,输出如下结果:
在这里插入图片描述

此时 sleep(10) 还没结束,我们快速看看进程信息:
在这里插入图片描述

可以看到父进程是 19185,子进程是 19186.

等 10 秒后,控制台继续输出:
在这里插入图片描述

此时我们再使用 ps 看看进程信息:
在这里插入图片描述
可以看到子进程的父进程变成了 1 号进程,确实是被 init 接管了,等子进程自己结束后,init 就是回收它。
该案例是死循环,会一直输出,可以用 kill -9 19186 结束子进程。

僵尸进程

概念:子进程结束了,由于父进程很忙,没时间回收子进程,那么子进程就成了 僵尸进程。

需要记住,无法使用 kill 杀死僵尸进程,都已经是僵尸了,还怎么杀死?
需要使用 kill 杀死他的父进程,让僵尸进程变成孤儿进程,init 会接管/回收孤儿进程。
每个进程结束后都必然会经历僵尸态,时间长短的差别而已。

代码演示:实现一个僵尸进程

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

int main() {

        int pid;

        pid = fork();

        if(pid == 0) {
                // 这是子进程
                printf("我是子进程 id: %d, 我先挂了\n", getpid());
        } else if(pid > 0) {
                printf("我是父进程, id: %d  我在 sleep, 我很忙...\n", getpid());
                sleep(100);
        }
        return 0;
}

程序执行后:
在这里插入图片描述
ps ajx 查看进程状态:
在这里插入图片描述
Z+ 就表示僵尸进程。

要么等待父进程空闲出来回收子进程。
要么手动 kill 父进程,让 init 进程回收子进程。

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

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

相关文章

frp 内网穿透 linux部署版

frp 内网穿透 linux部署版 前提安装 frp阿里云服务器配置测试服务器配置访问公网 前提 使用 frp&#xff0c;您可以安全、便捷地将内网服务暴露到公网&#xff0c;通过访问公网 IP 直接可以访问到内网的测试环境。准备如下&#xff1a; 公网 IP已部署好的测试服务 IP:端口号阿…

Linux系统部署前后端分离项目

一、Nginx简介 1.1 什么是nginx? Nginx&#xff08;发音同"engine x"&#xff09;是一个高性能的反向代理和 Web 服务器软件&#xff0c;最初是由俄罗斯人 Igor Sysoev 开发的。Nginx 的第一个版本发布于 2004 年&#xff0c;其源代码基于双条款 BSD 许可证发布&am…

人脸高清算法GFPGAN之TensorRT推理

1. 综述 最近由于做数字人项目&#xff0c;采用的是wav2lip GFPGAN进行人脸面部高清&#xff0c;但GFPGAN模型本身比较大&#xff0c;所以想着使用TensorRT来代替原始的pth推理看看能否提升运行速度&#xff0c;于是便开始了这趟windows1之下进行GFPGAN的trt推理的折腾之旅。…

Python Web开发记录 Day5:jQuery(JavaScript库)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 五、jQuery1、jQuery-选择器和菜单案例①快速上…

看视频,学习使用MindOpt APL 建模语言编码数学规划问题,练习语法,实战拿奖品

活动介绍 活动名称&#xff1a;看视频&#xff0c;补充代码&#xff0c;拿精美礼品 活动规则&#xff1a; 浏览视频学习MAPL&#xff0c;完善“例题”。需要完善的内容&#xff1a;补充约束条件、读取csv表格数据&#xff0c;将决策变量的取值输出为csv表格&#xff0c;验证一…

leetcode 热题 100_最长连续序列

题解一&#xff1a; 哈希表&#xff1a;找连续最长的数字序列&#xff0c;很容易联想到排序&#xff0c;但排序的时间复杂度O(nlogN)过大&#xff0c;判题容易超时。因此我们需要使用哈希表来快速查找&#xff0c;序列中是否存在与某个数相邻的数。用HashSet建立哈希表并去重&a…

【.NET Core】深入理解IO - FileSteam流

【.NET Core】深入理解IO - FileSteam流 文章目录 【.NET Core】深入理解IO - FileSteam流一、IO流概述二、文件流FileStream2.1 FileStream概述2.2 FileStream检测流位置更改2.3 FileStream构造函数2.4 FileStream常用属性2.5 FileStream.Read方法2.6 FileStream.Write方法2.7…

逻辑漏洞(pikachu)

#水平&#xff0c;垂直越权&#xff0c;未授权访问 通过个更换某个id之类的身份标识&#xff0c;从而使A账号获取&#xff08;修改、删除&#xff09;B账号数据 使用低权限身份的账号&#xff0c;发送高权限账号才能有的请求&#xff0c;获得其高权限操作 通过删除请求中的认…

Python学习DAY09_文件和异常

文件和异常 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。 在 Python 中实现文件的读写操作其实非常简单&#xff0c;通过 Python 内置的 open 函数&#xff0c;我们可以指定文件名、操作模式、编码信…

物联网主机E6000引领工业自动化的新篇章

E6000——多协议、多接口的全能战士 在工业4.0的大潮中&#xff0c;物联网的应用正在逐步深入到各个领域。而E6000物联网主机就是其中的佼佼者&#xff0c;它以其卓越的性能和强大的功能&#xff0c;成为推动工业自动化发展的一股重要力量。 E6000是一款多协议、多接口的物联…

Tomcat安装,配置文件、组件

一、Tomcat的基本功能 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询 跨越 ManyToManyField 或反查 ForeignKey &#xff08;例如从 Blog 到 Entry &#xff09;时&#xff0c;对多个属性进行过滤会产生这样的问题&#xff1a;是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter()&#xff0c;通过一个例子看&#xf…

mysql,for循环执行sql

遇到一个问题&#xff0c;我需要模拟上百万数据来优化sql&#xff0c;线上数据down不下来&#xff0c;测试库又没有&#xff0c;写代码执行要么慢要么就是sql语句太长。 于是&#xff0c;直接用mysql自带的功能去实现&#xff01; 简单而简单 mysql可以for循环&#xff1f;没…

vue中将某个不太规则的json转成对象,或者将对象转成json字符串

vue中将某个不太规则的json转成对象&#xff0c;或者将对象转成json字符串 以我自己做的项目某个不规则的json为例 将json对象转成json字符串&#xff1a; JSON.stringify(jsonData); 将不规则json字符串转成对象并获取对应的属性的值&#xff1a; JSON.parse(jsonData).Name…

机器学习项目外包注意事项

将机器学习项目外包给外部团队或合作伙伴是一种常见的做法&#xff0c;特别是当您的团队缺乏特定领域的专业知识或资源时。以下是一些关于机器学习项目外包的要点和注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

JavaScript new、apply call 方法

new、apply、call、bind JavaScript 中的 apply、call和 bind 方法是前端代码开发中相当重要的概念&#xff0c;并且与 this 的指向密切相关 new new 关键词的主要作用 就是执行一个构造函数、返回一个实例对象 根据构造函数的情况&#xff0c;来确定是否可以接受参数的传递…

电车降价,不如腾讯云服务器价格降得多,61元一年服不服?

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

寒假作业Day 02

这是第二天的作业&#xff0c;fighting&#xff01; Day 02 一、选择题 首先char* s[6]是指针数组&#xff0c;也就是其存储的都是这些字符串的地址&#xff0c;其实际上的类型为char**&#xff0c;而fun函数传入了s数组的首地址。而后续fun函数中打印字符&#xff0c;p[i]即…

ShardingSphere 5.x 系列【18】自定义类分片算法

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. ClassBasedShardingAlgorithm3. 案例演示3.1 STANDARD3.2 COMPLEX…

逆变器专题(16)-构网型逆变器与跟网型逆变器

相应仿真原件请移步资源下载 现如今&#xff0c;常规的逆变器控制方法主要分为跟网型以及构网型逆变器 跟网型逆变器即常规意义上的并网逆变器&#xff0c;即输出电流直接接入大电网&#xff0c;通常为电流源型逆变器&#xff0c;其输出电流的相位与频率时随着电网电压而随时进…