Linux--僵死进程(僵尸进程)

2023-10-26

1.僵死进程产生的原因或者条件:

当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程;(即就是子进程结束了,但父进程还没有结束的时候才会出现僵死进程)

(代码中 ,子先于父)(& 后台运行)

当一个进程结束的时候,只有进程的退出码被父进程获取后,父进程才能退出,进程的PCB才会被释放,否则父进程会一直等待退出码,在得到退出码之前,这个进程就是一个僵死进程。

2.演示僵死进程:

vim fork.c

#include<stdlib.h>
#include<wait.h>

int main()
{
    char *s=NULL;
    int n=0;//控制父子进程的次数
    
    pid_t id=fork();
    assert(id!=-1);
    
    if(id==0)//子进程
    {   
        s="child";
        n=7;
    }   
    else
    {   
        s="parent";
        n=3;
        int val=0;
        if(WIFEXITED(val))//如果正常退出
        {
            printf("val=%d\n",WEXITSTATUS(val));
        }
        wait(&val);
        printf("val=%d\n",val);
    }   
    //父子进程一起运行
    int i=0;
    for(;i<n;i++)
    {   
        printf("s=%s ,pid=%d ,ppid=%d n的地址=%p n=%d\n",s,getpid(),getppid(),&n,n);
        sleep(1);
    }   
    exit(0);
}

 3.僵死进程带来的影响

(1)进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎 么样了。可父进程如果一直不读取,那子进程就一直处于Z状态。

(2)维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话 说,Z状态一直不退出,PCB一直要维护

(3)那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?

答:是的。因为数据结构 对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空 间

(4)会造成内存泄漏

4.如何去处理僵死进程?

(1)父进程先结束

比如子进程的n改为7,父进程的n改为3;

(子进程会变成孤儿进程,孤儿进程会被收养,"父进程"就会获取退出码;(调用wait);

(红帽子是init(pid==1)收养孤儿进程,Unbuntu是操作系统指定了一个进程));

(2)父进程调用wait()方法获取子进程的退出码;

父进程执行7,子进程改为3;就能观察到僵死进程(放到后台运行&,ps);

#include<stdlib.h>
#include<wait.h>

int main()
{
    char *s=NULL;
    int n=0;//控制父子进程的次数
    
    pid_t id=fork();
    assert(id!=-1);
    
    if(id==0)//子进程
    {   
        s="child";
        n=7;
    }   
    else
    {   
        s="parent";
        n=3;
        int val=0;
        if(WIFEXITED(val))//如果正常退出
        {
            printf("val=%d\n",WEXITSTATUS(val));
        }
        wait(&val);
        printf("val=%d\n",val);
    }   
    //父子进程一起运行
    int i=0;
    for(;i<n;i++)
    {   
        printf("s=%s ,pid=%d ,ppid=%d n的地址=%p n=%d\n",s,getpid(),getppid(),&n,n);
        sleep(1);
    }   
    exit(0);
}

处理僵死进程的方法一:

父进程执行3次,子进程改为7次;去观察僵死进程没有了;收养孤儿进程 的,一定会调用wait(就是获取退出码的);获取了退出码,操作系统就会把

pcb删掉,就不会出现僵死进程;

处理僵死进程的方法二:

父进程调用wait方法;

1命令, 2 系统调用 3 库函数

man 2 wait

else
{
	s="parent";
	n=7;
	int val=0;
    wait(&val);
    printf("val=%d\n",val); 
}

其实两种处理僵死进程的方法的本质是一样的,都调用了wait方法,获取退出码;

但是两种方法都有区别:就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会去执行

  1 #include <stdio.h>
  2 #include<assert.h>
  3 #include<unistd.h>
  4 #include<string.h>
  5 #include<stdlib.h>
  6 #include<wait.h>
  7 
  8 int main()
  9 {
 10     char *s=NULL;

 11     int n=0;//控制父子进程的次数
 12 
 13     pid_t id=fork();
 14     assert(id!=-1);
 15 
 16     if(id==0)//子进程
 17     {
 18         s="child";
 19         n=3;
 20     }
 21     else
 22     {
 23         s="parent";
 24         n=7;
 25         int val=0;
 26         wait(&val);
 27         printf("val=%d\n",val);
 28     }//获取退出码
 29     //父子进程一起运行
 30     int i=0;
 31     for(;i<n;i++)
 32     {
 33         printf("s=%s ,pid=%d ,ppid=%d n的地址=%p n=%d\n",s,getpid(),getppid    (),&n,n);
 34         sleep(1);
 35     }
 36     exit(0);
 37 }

5.子进程的退出码

改写码:exit(3)

执行显示val=768;

 man 2 wait

WIFEXITED:正常退出的状态;

WEXITSTATUS:获取退出码;

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

Linux--僵死进程(僵尸进程) 的相关文章

  • -bash:!/usr/bin/env:未找到事件[重复]

    这个问题在这里已经有答案了 我在尝试将 shebang 写入 python 脚本时收到此奇怪的错误消息 echo usr bin env python gt scripts sandbox py bash usr bin env event
  • 如何从纯文本中查找键值存储中的值

    给定一个纯文本文件 其中包含 FOO foo BAR bar BAZ baz 我们如何grep使用键获取值 Use a 向后看 https regex101 com r q3FNpe 1 grep Po lt FOO w file foo
  • Eclipse CDT 内置包含目录

    Under Eclipse CDT gt Project Settings gt C C General gt Paths and Symbols gt Includes gt GNU C 有一个包含路径的列表 有些是粗体的并且是特定于项目
  • Docker 无法写入使用 -v 挂载的目录,除非它有 777 权限

    我正在使用docker solr https github com makuk66 docker solr使用 docker 生成图像 我需要在其中安装一个目录 这是我使用 v flag 问题是容器需要写入我已安装到其中的目录 但似乎没有权
  • 如何在生产环境中运行 spring boot 可执行 jar?

    Spring Boot 的首选部署方法是通过内部包含 tomcat 的可执行 jar 文件 它是从一个简单的开始java jar myapp jar 现在 我想将该 jar 部署到 EC2 上的 Linux 服务器上 我是否遗漏了某些内容
  • 来自外部 .diff 文件的交互式补丁

    Linux 是否有命令或程序允许交互式地修补源代码 在屏幕上打印每个块并在将其应用到文件之前等待确认 就像是git add p 但是从另一个 diff 文件中进行更改 您始终可以在 shell ruby python 中编写脚本 逐行读取该
  • 如何在命名管道 (mkfifo) 上执行非阻塞 fopen?

    如果我有一个程序使用 mkfifo 创建并尝试打开命名管道 如何在不阻塞的情况下打开管道进行读取或写入 具体来说 我正在编写一个 C 程序 它可以在有或没有 GUI 的情况下运行 用 Java 编写 在 C 程序中 我使用 mkfifo 成
  • Alsa:如何在 2 个输出上复制流并保存系统配置?

    我的声卡是 Audigy SE SB0570 我想不仅在扬声器上而且在耳机上同时播放相同的立体声流 我在空的 asoundrc 上尝试这个配置 pcm quad type multi slaves a pcm hw 0 0 green ho
  • 使用 java.nio.Files 更改 Linux 下的文件所有者组

    我有一台 Linux 服务器 并且正在 Java 中为服务器上的多个网站运行图像调整大小作业 网站文件由不同的操作系统用户 组拥有 新创建的缩略图 预览由运行调整大小作业的用户拥有 现在我正在谷歌搜索如何在调整大小程序中更改新创建的预览 缩
  • 使用curl复制本地文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有办法用curl复制本地文件 我需要它作为cp命令的替代品 这有点奇怪 但我正在一个 cp 不可用的环境中工作 你可以说 curl o
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 如何使用AWK从文件中连续输出行

    我有一个多行文件 我想连续输出文件的某些行 比如第一次 从第1行打印到第5行 下次 打印第2行到第6行 依此类推 我发现 AWK 是一个非常有用的函数 我尝试自己编写代码 但它什么也没输出 以下是我的代码 bin bash for n in
  • 如何重新安装最新的cmake版本?

    我想在Linux环境下安装cmake的最新版本 我安装了 cmake 3 5 版 但某些应用程序不支持 我尝试通过卸载当前版本来升级它 但是当我使用 sudo apt get install cmake 重新安装时 我重新安装了相同的版本
  • ModemManager:mmcli 获取信号强度

    我无法检索 Sierre Wireless MC7304 上的信号强度 另外通过 mmcli 发送 AT 命令似乎不起作用 sudo mmcli m org freedesktop ModemManager1 Modem 0 signal
  • 如何格式化 .CSV 文件的日期字段并在字符串字段中包含多个逗号

    我有一个 CSV 文件 file csv 其数据全部用双引号引起来 文件的示例格式如下 column1 column2 column3 column4 column5 column6 column7 Column8 Column9 Colu
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 将静态链接的 elf 二进制文件转换为动态链接的

    我有一个 elf 二进制文件 它已静态链接到 libc 我无权访问其 C 代码 我想使用 OpenOnload 库 它在用户空间中实现了套接字 因此与标准 libc 版本相比提供了更低的延迟 OpenOnload 实现标准套接字 api 并
  • 无法从外部 bash 脚本正确设置 MySQL 密码

    我有两个脚本 主要的一个脚本执行一些不同的操作并调用第二个脚本 第二个脚本安装 MySQL 从我的主脚本中我做了这样的事情 read p Set the password for the database min 4 characters
  • Linux 中如何确定哪个进程正在使用某个端口

    我目前正在其默认端口上运行 RethinkDB 因为如果我将浏览器指向localhost 8080我看到 RethinkDB Web 界面 我想关闭 RethinkDB 并使用以下命令在另一个端口上重新打开它 port offset争论 然
  • Plink 通过 C# 返回不需要的字符

    通过 C 使用 Plink 时 我在结果前后收到不需要的字符 Command ls l informatica tgtdynamicparams out grep vaulttest grep Sep 1 awk print 9 sort

随机推荐

  • 夜莺(Flashcat)V6监控(二):夜莺页面全网最详细功能介绍及案列

    目录 一 如何把数据转发给多个时序库 二 监控仪表盘的配置 三 告警的配置管理 1 告警规则 基础配置 规则配置 分为Metric和Host机器类型的告警 生成配置 通知配置 2 内置规则 3 屏蔽规则 4 订阅规则 5 活跃告警 6 历史
  • Python编程 从入门到实践 12-4

    12 4 按键 创建一个程序 显示一个空屏幕 在事件循环中 每当检测到 pygame KEYDOWN 事件时都打印属性 event key 运行这个程序 并按各种键 看看 Pygame如何响应 import sys import pygam
  • node多版本安装--nvm丝滑切换node版本

    以下是我总结得俩种nvm切换node版本的方式 首先是第一种 需要手动配置的 第一步把自己电脑上面的node卸载 在本机应用程序中卸载 然后手动本机目录删除剩余残留node npm等文件 C Users 86184 AppData C Us
  • 函数的极值点、零点、驻点、拐点的理解

    总结 零点 函数值为0的点 极值点 函数单调性发生变化的点 驻点 函数的一阶导数为0的点 拐点 函数凹凸性变化的点 学习链接 https wenku baidu com view 4a009cf5650e52ea5418982e html
  • [工程数学]1_特征值与特征向量

    首先向b站up DR CAN致敬 视频二刷了 为了收获 理解更多 用极慢的方式 把笔记抄了下来 整理一遍 为了好翻阅 后续会转成pdf格式 放微信公众号后台获取 现代控制理论 2 state space状态空间方程 在state space
  • java是什么_Java是什么?Java有什么用?

    我们经常提到Java 很多小白只听说过但对其并没有太多具体的了解 那么Java是什么 Java有什么用 今天就来探讨一下 我们常常会听说 Java是世界第一语言 很多应用软件的开发都离不开Java Java真的这么强大吗 其实 Java的内
  • 多链路传输技术在火山引擎 RTC 的探索和实践

    动手点关注 干货不迷路 传统的数据传输方式大多是利用一个链路 选择设备的默认网卡进行传输 使用这种方式实现实时音视频通话时 如果默认网络出现问题 如断网 弱网等 用户的通信就会发生中断或者卡顿 影响用户体验 多链路传输 顾名思义 就是使用多
  • electron_vue—实现消息通知 及 解决通知不显示问题

    实现消息通知 window linux macOS 这三个操作系统都为应用程序提供了向用户发送通知的方法
  • python使用pip安装出现pip is configured with locations that require TLS/SSL异常处理方法

    问题描述 最近给服务器安装python环境 通过源码方式安装Python3 8之后 使用pip功能出现异常 提示 root localhost pip3 install you get pip is configured with loca
  • 大数据处理中的关键算子:分割(Split)和选择(Select)

    在大数据处理中 分割 Split 和选择 Select 是两个常用的算子 它们在数据转换和处理过程中发挥着重要的作用 本文将详细介绍这两个算子的功能和使用方法 并附上相应的源代码示例 1 分割 Split 分割算子用于将一个数据集拆分成多个
  • 图的深度遍历和广度遍历

    理论部分 图的深度遍历和广度遍历都不算很难像极了二叉树的前序遍历和层序遍历 如下面的图 可以用右边的邻接矩阵进行表示 假设以顶点0开始对整幅图进行遍历的话 两种遍历方式的思想如下 1 深度优先遍历 depthFirstSearch DFS
  • LISN到底是啥?干啥用的?

    LISN到底是啥 干啥用的 LISN是在EMC测试的时候 会被使用的设备 如下图所示 双路V型电源阻抗稳定网络 它完全符合CISPR16 1 2 MIL STD 461F VDE 0876 FCC Part 15标准的要求 其等效电路为50
  • 20191004

    A 解 1 我们发现只需要关心处于结果字符串前 k 位的字符 因此考虑从后往前处理 对于一个询问区间 我们暴力连边 用并查集维护 x 的父亲等于 y 相当于位于 x 的字符是从位于 y 的字符处复制过来的 然后删掉这个区间 更新其他元素的排
  • Hutool BeanUtils.copyProperties的四种用法 空不拷贝/忽略拷贝/空不和忽略拷贝/全拷贝

    关注公众号 奇叔码技术 回复 java面试题大全 或者 java面试题 即可领取资料 一 Hutool BeanUtils copyProperties的四种用法 空不拷贝 忽略拷贝 空不和忽略拷贝 全拷贝 1 第一种用法 BeanUtil
  • STM32-CubeMX学习笔记

    例程参考链接 http bbs elecfans com jishu 714935 1 1 html 1 首次使用参见文档 http blog csdn net tq384998430 article details 53466263 2
  • 彻底搞懂Java中的synchronized关键字

    synchronized的作用 synchronized 的作用主要有三 原子性 所谓原子性就是指一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断 要么就都不执行 被synchronized修饰的类或对象的所有操作都是原子
  • 【歪门邪道】懒得麻烦UI同学切图所以用AndroidStudio生成icon

    每次新建项目 是不是都默认生成一个 ic launcher 对于这个icon 你是不是从来都是一删了事 你有没有一次 打开并留意过里头 ic launcher foreground 和 ic launcher background 文件 如
  • 关于以太坊的nonce值

    文章目录 每笔交易nonce值的各个情况 总结 关于Nonce的保管 依赖节点 自行管理nonce 参考代码 nonce在区块链中是一个非常重要的概念 从比特币到以太坊都有nonce的身影 在比特币中 nonce主要用于调整pow挖矿的难度
  • Go语言学习——4、数据存储:数组,切片,映射

    目录 一 数组 1 声明数组 2 初始化数组 3 遍历数组 二 切片 1 从数组或切片生成新的切片的语法格式 2 直接生成一个新的切片 3 切片添加元素 4 从切片删除元素 5 遍历切片 三 映射 1 声明映射 2 初始化映射 3 遍历映射
  • Linux--僵死进程(僵尸进程)

    1 僵死进程产生的原因或者条件 当子进程先于父进程结束 父进程没有获取子进程的退出码 此时子进程变成僵死进程 即就是子进程结束了 但父进程还没有结束的时候才会出现僵死进程 代码中 子先于父 后台运行 当一个进程结束的时候 只有进程的退出码被