IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 孤儿进程和僵尸进程 -> 正文阅读

[系统运维]孤儿进程和僵尸进程

Unix进程模型中,进程是按照父进程产生子进程,子进程产生子子进程这样的方式创建出完成各项相互协作功能的进程的。当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

那么孤儿进程是什么呢?

1 孤儿进程

孤儿进程就是父进程先于子进程终止,这时子进程就是【孤儿进程】,会被init收养。

先熟悉一个命令:查看进程状态

ps ajx

执行

?依次是父进程id、进程id、组进程id、会话进程id

这里只要关注父进程id和进程id即可,

模拟父进程先于子进程终止

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
 
int main()
{
    pid_t pid = fork();
    // 子进程执行
    if (pid == 0) {
        while (1) {
            printf("I'm child, my pid = %d, my parent pid = %d\n", getpid(), getppid());
            sleep(2);
        }
    } else if (pid > 0) {
        // 父进程执行
        printf("I'm parent, my pid = %d\n", getpid());
        sleep(9);
        printf("==============I'm going to die=========\n");
    } else if (pid == -1) {
        // fork出错
        perror("fork error");
        exit(1);
    }

    return 0;
}

执行

可以看到有两个进程。子进程的PID是9714、父进程的PID是9713、父进程的父进程的PID是9630。

当父进程运行结束后,父进程PID变成1457。

查看1457进程

?这里/lib/systemd/systemd --user?就是【孤儿收养院】

这时子进程(PID=9714)就是孤儿进程,它会一直执行。

怎么解决孤儿进程问题呢?

直接kill

kill -9 9714

?2?僵尸进程

简单来说就是:子进程终止,父进程没有及时回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。

kill 对其无效。这里要注意,每个进程结束后都必然会经历僵尸态,时间长短的差别而已。

当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。如果父进程没有这么做的话,会产生什么后果呢?此时,子进程虽然已经退出了,但是在系统进程表中还为它保留了一些退出状态的信息,如果父进程一直不取得这些退出信息的话,这些进程表项就将一直被占用,此时,这些占着茅坑不拉屎的子进程就成为“僵尸进程”(zombie)。系统进程表是一项有限资源,如果系统进程表被僵尸进程耗尽的话,系统就可能无法创建新的进程。

模拟子进程先于父进程终止。

#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
 
int main()
{
    pid_t pid = fork();
    // 子进程执行
    if (pid == 0) {
        printf("I'm child,my pid = %d, my parent = %d\n",getpid(), getppid());
        sleep(9);
        printf("---------------I'm going to die-------------------\n");
    } else if (pid > 0) {
       while (1) {
            printf("I'm parent, my pid = %d, my son pid = %d\n",getpid(), pid);
            sleep(1);
        }
    } else if (pid == -1) {
        perror("fork error");
        exit(1);
    }

    return 0;
}

运行

子进程PID是10087,父进程PID是10086。

执行完之后,子进程运行结束,父进程一直打印循环语句。

子进程10087成为僵尸进程。

回收僵尸进程,得kill它的父进程,让它成为孤儿进程,让孤儿院去回收它。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:29:48  更:2022-06-01 15:32:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 16:43:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码