92.Linux的僵死进程以及处理方法

news2024/11/28 4:51:26

目录

1.什么是僵死进程?

2.代码演示僵死进程 

3.解决办法


1.什么是僵死进程?

  1. 僵死进程是指一个子进程在父进程之前结束,但父进程没有正确地等待(使用 waitwaitpid 等系统调用)来获取子进程的退出状态。当一个进程结束时,它的退出状态会一直保存,直到父进程通过适当的系统调用来获取它。如果父进程没有获取子进程的退出状态,那么子进程就会变成僵死状态。
  2. 我们的程序在退出的时候:return 0,exit(0),之类的,这个0就是退出码,状态信息,这个东西存储在当前进程的PCB中,会有一个整型值来存储退出码。
  3. 当我们子进程结束以后,会把退出码写到PCB中,然后希望父进程可以获得到这个退出码,然后父进程就可以看到子进程是正常运行结束还是出错退出。正常的话我们return 0,失败的话我们return -1。

2.代码演示僵死进程 

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[], char *envp)
{
    char *s = NULL;
    int n = 0;
    pid_t pid = fork();
    assert(pid != -1);
    if (pid == 0)
    {
        s = "child";
        n = 4;
    }
    else
    {
        s = "parent";
        n = 10;
    }
    int i = 0;
    for (; i < n; i++)
    {
        printf("pid=%d,s=%s\n", getpid(), s);
    }

    exit(0);
}

 

 从上图中可以看到,当子进程结束后,并没有消失,仍然可以在系统中观测到,但此时子进程其实已经运行结束了,此时子进程的状态被称为僵死状态,系统把处于该类状态的进程称为僵死进程< defunct >

3.解决办法

        在 Unix/Linux 系统中,可以使用 waitwaitpid 函数等待子进程的终止,并获取其退出状态。如果父进程没有执行这些调用,子进程就会一直保留在僵死状态,占用系统资源。

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[], char *envp)
{
    char *s = NULL;
    int n = 0;
    pid_t pid = fork();
    assert(pid != -1);
    if (pid == 0)
    {
        s = "child";
        n = 4;
    }
    else
    {
        s = "parent";
        n = 10;

        int val = 0;
        pid_t id = wait(&val);
        if (WIFEXITED(val))
        {
            printf("id=%d,val=%d\n", id, WEXITSTATUS(val));
        }
    }
    int i = 0;
    for (; i < n; i++)
    {
        printf("pid=%d,s=%s\n", getpid(), s);
    }

    exit(0);
}

显而易见,int val = 0; pid_t id = wait(&val); 的执行起到了阻塞作用,因为要获取子进程的退出码,如果子进程还没有结束,就获取不到,父进程就阻塞住了,先将子进程执行完后,获取到退出码了,才开始执行父进程。 

 

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

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

相关文章

流程图怎么画,用什么软件做?一文弄懂流程图:从流程图的定义、流程图各种图形的含义到流程图制作,一步到位!

流程图&#xff0c;也被称为过程流程图或流程图&#xff0c;是一种表达工作或过程中步骤之间逻辑关系的可视化工具。它主要由不同形状和符号的框以及指向这些框的箭头组成。每个形状或符号都有特定的含义&#xff0c;它们代表了工作流程中的一种特定类型的步骤或动作。 使用流…

视频集中存储/云存储平台EasyCVR级联下级平台的详细步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

JVM bash:jmap:未找到命令 解决

如果我们在使用JVM的jmap命令时遇到了"bash: jmap: 未找到命令"的错误&#xff0c;这可能是因为jmap命令没有在系统的可执行路径中。 要解决这个问题&#xff0c;可以尝试以下几种方法&#xff1a; 1. 检查Java安装&#xff1a;确保您已正确安装了Java Development …

【Android】导入三方jar包/系统的framework.jar

1.Android.mk导包 1).jar包位置 与res和src同一级的libs中(没有就新建) 2).Android.mk文件 LOCAL_STATIC_ANDROID_LIBRARIES&#xff1a;android静态库&#xff0c;经常用于一些support的导包 LOCAL_JAVA_LIBRARIES&#xff1a;依赖的java库&#xff0c;一般为系统的jar…

[修改Linux下ssh端口号]解决无法修改sshd_config无法修改

前言&#xff1a;写本文的前因是本人的阿里云服务器经常被黑客暴力破解ssh的22端口号。再网络上搜索解决都是说使用root权限进行修改&#xff0c;但本人在root下也无法成功进行修改sshd_config文件。所以在大量搜索下终于找到了解决方案&#xff0c;现在分享出来给有需要的人使…

一个集成了AI和BI报表功能的新一代数据库管理系统神器--Chat2DB

世人皆知Navicate&#xff0c;无人识我Chat2DB &#x1f4d6; 简介 Chat2DB 是一款开源免费的多数据库客户端工具&#xff0c;支持多平台和主流数据库。 集成了AI的能力&#xff0c;能进行自然语言转SQL、SQL解释、SQL优化、SQL转换 ✨ 好处 1、AIGC和数据库客户端的联动&am…

广州华锐互动:办税服务厅税务登记VR仿真体验让税务办理更加灵活高效

在数字化世界的今天&#xff0c;我们正在见证各种业务过程的转型&#xff0c;而税务办理也不例外。最近&#xff0c;一种全新的交互方式正在改变我们处理税务的方式&#xff1a;虚拟现实&#xff08;VR&#xff09;。 首先&#xff0c;用户需要戴上虚拟现实头显&#xff0c;然后…

怎么调监控清晰度,监控画面不清晰怎么修复?

监控画面不清晰怎么修复&#xff0c;通过调整视频的分辨率可以达到使视频更清晰的目的&#xff0c;另外就是如果是室外的环境下&#xff0c;视频的监控镜头会积累灰尘&#xff0c;擦一下镜头有可能会使得拍摄的视频更清晰一些。另外就是可以通过一些软件将视频分辨率提高&#…

互联网医院系统:数字化时代中医疗服务的未来

随着数字化时代的发展&#xff0c;互联网医院系统在医疗服务中的作用日益凸显。本文将讨论互联网医院系统的一些关键技术方面&#xff0c;探讨这些技术如何推动医疗服务进入数字化时代。 1. 数据智能与个性化服务 互联网医院系统依赖于大数据分析和人工智能技术&#xff0c;…

网络运维Day19

文章目录 环境准备数据备份为什么要备份什么是备份备份到哪里什么时候备份如何备份 完整备份物理备份逻辑备份测试恢复所有库 构建MySQL服务xtrabackup完全备份与恢复完全备份完全恢复增量备份增量恢复 总结 环境准备 IP地址采用自动分配&#xff0c;以自己的为准 可以将之前的…

【LeetCode刷题-滑动窗口】--1004.最大连续1的个数III

1004.最大连续1的个数III 方法&#xff1a;滑动窗口 class Solution {public int longestOnes(int[] nums, int k) {int left 0,right 0,zero 0,res 0;while(right < nums.length){if(nums[right]0){zero;}while(zero > k){if(nums[left] 0){zero--;}left;}res Ma…

汽车CAN/ CAN FD数据记录仪在上汽大通诊断测试部门的应用

CAN/CANFD数据诊断记录仪在 规格&#xff1a;数据记录诊断仪 功能&#xff1a;CAN(FD)数据记录 UDS诊断 WIFI收发报文

【搭建统一的IOS开发环境,Ruby链之CocoaPods】

CocoaPods 前提HomebrewHomebrew是什么&#xff1f;Homebrew怎么安装?Homebrew怎么用?有哪些必须知道的命令Homebrew和CocoaPods的关系卸载Homebrew RubyrbenvRubyGems 和 Bundler安装Ruby管理Ruby更新Ruby替换Ruby镜像方式1方式2 CocoaPods安装CocoaPodsCocoaPods使用安装的…

代码随想录算法训练营第22天|235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

JAVA代码编写 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的…

systemverilog:interface中端口方向理解

&#xff08;1&#xff09;从testbench的角度看&#xff0c;tb中信号的输入输出方向与interface中信号输入输出方向一致&#xff1a; &#xff08;2&#xff09;从DUT角度看&#xff0c;DUT中信号输入输出方向与interface中信号输入输出方向相反。简单图示如下&#xff1a; 代…

vue2项目从0搭建(二):配置代理,登录功能和菜单权限

前言: 发送ajax,fetch,websocket请求获取服务端的数据,配置代理是必须的环节 登录功能和菜单权限是后台管理系统中非常经典且十分重要的业务,这里涉及的知识点也是比较多的,坑也多,面试也是很重要的一环。 这里必须得会,没错是必须。 配置服务代理 创建两个node服务 在和…

±15kV ESD 保护、3V-5.5V 供电、真 RS-232 收发器MS2232/MS2232T

产品简述 MS2232/MS2232T 芯片是集成电荷泵&#xff0c;具有 15kV ESD 保护的 RS-232 收发器&#xff0c;包括两路接收器、两路发送器。 芯片满足 TIA/EIA-232 标准&#xff0c;为异步通信控制器和串口连 接器提供通信接口。 芯片采用 3V-5.5V 供电&#xff0c;电荷泵仅用…

代码随想录算法训练营|五十五天

两个字符串的删除操作 583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 因为两个字符串都能删除&#xff0c;所以字符不匹配的话就有三个方向取最小值赋值给dp[i,j]&#xff0c;不过这里dp[i-1,j-1]2dp[i,j-1]1&#xff0c;从字面上理解 就是 当 同时删wo…

mfc140u.dll丢失的解决方法,以及mfc140u.dll解决方法的优缺点

在使用电脑过程中&#xff0c;有时会遇到一些与动态链接库文件&#xff08;DLL&#xff09;相关的错误。其中&#xff0c;mfc140u.dll丢失的错误是较为常见的一种。当这个关键的mfc140u.dll文件丢失或损坏时&#xff0c;可能会导致某些应用程序无法正常运行。在本文中&#xff…