当前位置: 首页 > news >正文

孤儿进程 僵尸进程 守护进程及wait函数详解

一、 孤儿进程

孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程。

/*************************************************************************
	> File Name: 孤儿进程.c
	> Author: 
	> Mail: 
	> Created Time: Sat 22 Dec 2018 08:15:49 PM CST
 ************************************************************************/

#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t pid;
    pid=fork();
    if(0 == pid)
    {
        printf("I am son My ID is %d,My parent ID is %d\n",getpid(),getppid());
        sleep(3);
        printf("I am son My ID is %d,My parent ID is %d\n",getpid(),getppid());
        
    }
    else if(pid>0)
    {
        sleep(1);
        printf("I am parent my id is %d\n",getpid());
    }
    else
    {
        perror("fork 失败");
    }
    return 0;
    
}

在这里插入图片描述

二、 僵尸进程

僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。
特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。思考!用什么办法可清除掉僵尸进程呢?

三、 守护进程

四、 wait函数详解

wait函数

  • 一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变量$?查看,因为Shell是它的父进程,当它终止时Shell调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。

  • 父进程调用wait函数可以回收子进程终止信息。该函数有三个功能:

    ① 阻塞等待子进程退出
    ② 回收子进程残留资源
    ③获取子进程结束状态(退出原因)。

  • pid_t wait(int *status); 成功:清理掉的子进程ID;失败:-1 (没有子进程)

    当进程终止时,操作系统的隐式回收机制会:1.关闭所有文件描述符 2. 释放用户空间分配的内存。内核的PCB仍存在。其中保存该进程的退出状态。(正常终止→退出值;异常终止→终止信号)

  • 可使用wait函数传出参数status来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。宏函数可分为如下三组:

  1. WIFEXITED(status) 为非0 → 进程正常结束
    WEXITSTATUS(status) 如上宏为真,使用此宏 → 获取进程退出状态 (exit的参数)
  2. WIFSIGNALED(status) 为非0 → 进程异常终止
    WTERMSIG(status) 如上宏为真,使用此宏 → 取得使进程终止的那个信号的编号。
  3. WIFSTOPPED(status) 为非0 → 进程处于暂停状态
    WSTOPSIG(status) 如上宏为真,使用此宏 → 取得使进程暂停的那个信号的编号。
    WIFCONTINUED(status) 为真 → 进程暂停后已经继续运行

waitpid函数

作用同wait,但可指定pid进程清理,可以不阻塞。
pid_t waitpid(pid_t pid, int *status, in options); 成功:返回清理掉的子进程ID;失败:-1(无子进程)
特殊参数和返回情况:
参数pid:

0 回收指定ID的子进程
-1 回收任意子进程(相当于wait)
0 回收和当前调用waitpid一个组的所有子进程
< -1 回收指定进程组内的任意子进程
返回0:参3为WNOHANG,且子进程正在运行。

linux进程的几个状态

  1. Linux进程状态:R (TASK_RUNNING),可执行状态&运行状态(在run_queue队列里的状态)

  2. Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态, 可处理signal

  3. Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态, 可处理signal, 有延迟

  4. Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态, 不可处理signal, 因为根本没有时间片运行代码

  5. Linux进程状态:Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。不可被kill, 即不响应任务信号, 无法用SIGKILL杀死

转载于:https://www.cnblogs.com/readlearn/p/10806392.html

相关文章:

  • 利用Java反射机制实现对象相同字段的复制
  • Markdown基本语法
  • 浅探前端图片优化
  • kubernetes 监控方案之:heapster+influxdb+grafana(十八)
  • Servlet-生命周期
  • CSS 文字太多用省略号表示
  • 互联网轻量级框架SSM-查缺补漏第四天
  • 无需Java代码通过JHipster生成有安全验证的微服务应用
  • BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
  • JS变量作用域
  • android环境搭建
  • Windows10 VS2017 C++多线程传参和等待线程结束
  • ZooKeeper的安装与部署
  • Vue.js常用指令:v-on
  • 如何设计一个比特币钱包服务
  • Google 是如何开发 Web 框架的
  • [译]CSS 居中(Center)方法大合集
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • eclipse的离线汉化
  • extract-text-webpack-plugin用法
  • Git 使用集
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 力扣(LeetCode)21
  • 前端存储 - localStorage
  • 数组的操作
  • 微信小程序--------语音识别(前端自己也能玩)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 赢得Docker挑战最佳实践
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #include到底该写在哪
  • (31)对象的克隆
  • (C)一些题4
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (理论篇)httpmoudle和httphandler一览
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)socket Aio demo
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • **PHP分步表单提交思路(分页表单提交)
  • **python多态
  • ... 是什么 ?... 有什么用处?
  • .Mobi域名介绍
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .NET中的Exception处理(C#)
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @RequestMapping处理请求异常
  • [ 转载 ] SharePoint 资料
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ1008][HNOI2008]越狱