僵尸进程介绍

子进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸进程。由于我们的程序也许是7*24小时不宕机的,程序不结束,僵尸进程残留在PCB中资源就不会被回收,所以我们要清晰的认识僵尸进程,在程序中尽量避免僵尸进程。

僵尸进程模拟

我们通过下面程序来进行模拟僵尸进程,父进程fork()5个子进程,最后一个子进程用于查看僵尸进程,让父进程最后死亡。

代码展示

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <error.h>
#include <sys/errno.h>void perr(const char* str)
{perror(str);exit(1);
}
int main(int argc,char* argv[])
{pid_t pid;int i;for( i = 0; i < 5;i++ ){if( (pid = fork()) == 0 ){break;  //子进程}else if (pid < 0){perr("fork error");    }}if( i < 4 )            //子进程0,1,2,3 最先死亡 模拟僵尸进程{printf("i am child process,pid = %d,ppid = %d.i am died.\n",getpid(),getppid());exit(1);}else if( i==4 )        //子进程4 显示僵尸进程{sleep(1);printf("i am child process[exec ps],pid = %d,ppid = %d.\n",getpid(),getppid());execlp("ps","ps","j",NULL);}else                   //父进程活3秒 查看僵尸进程现象 {printf("i am parent process,pid = %d,ppid = %d.i will die after 3s.\n",getpid(),getppid());sleep(3);}return 0;
}

僵尸进程现象

僵尸进程预防

如何预防僵尸进程呢?可能很多人都知道,子进程死亡了父进程回收资源呗。对,只要子进程死亡了,父进程负责收尸就行了。
这里有2种方式回收子进程资源。如下:
- 父进程在死亡之前轮询的去查看子进程是否死亡,死亡了就回收,主要使用wait/waitpid
- 父进程由自己的事情做,子进程死亡了通知父进程收尸,主要使用信号回调signal/sigaction
这里最好的方式当然是采用信号呗,有子进程死亡,父进程才进行回收!

代码展示

代码中要注意的是,子进程可能同时终止,同时发送信号,父进程执行信号回调函数但是默认只处理1个,所以要用while进行回收! while( (wpid = waitpid(-1,NULL,WNOHANG)) != -1 );

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <error.h>
#include <sys/errno.h>
#include <signal.h>
#include <wait.h>void perr(const char* str)
{perror(str);exit(1);
}
void wait_child(int signo)
{pid_t wpid;//子进程可能同时终止,同时发送信号到这里来默认只处理1个,所以要用while!while( (wpid = waitpid(-1,NULL,WNOHANG)) != -1 );waitpid(-1,NULL,0);
}
int main(int argc,char* argv[])
{pid_t pid;int i;struct sigaction act;act.sa_flags = 0;act.sa_handler = wait_child; sigemptyset(&act.sa_mask);sigaction(SIGCHLD,&act,NULL);for( i = 0; i < 5;i++ ){if( (pid = fork()) == 0 ){break;  //子进程}else if (pid < 0){perr("fork error");    }}if( i < 4 )            //子进程0,1,2,3 最先死亡 模拟僵尸进程{printf("i am child process,pid = %d,ppid = %d.i am died.\n",getpid(),getppid());exit(1);}else if( i==4 )        //子进程4 显示僵尸进程{sleep(1);           printf("i am child process[exec ps],pid = %d,ppid = %d.\n",getpid(),getppid());execlp("ps","ps","j",NULL);}else                   //父进程活3秒 查看僵尸进程现象{printf("i am parent process,pid = %d,ppid = %d.i will die after 3s.\n",getpid(),getppid());sleep(3);}return 0;
}

查看预防效果

Linux系统编程——僵尸的模拟以及僵尸进程的预防相关推荐

  1. linux终端和执行进程的关系,Linux系统编程第04期:打通进程与终端的任督二脉

    本课程是<嵌入式工程师自我修养>自学教程六步走中的第3步:Linux系统编程第04期. 进程,是Linux系统中任务调度运行的基本单元:一个程序的运行,都要被操作系统包装成"进程 ...

  2. Linux系统编程---11(会话,守护进程,创建守护进程)

    会话 创建会话 创建一个会话需要注意以下6点注意事项 调用进程不能是进程组组长,该进程变成新会话首进程 该进程成为一个新进程组的组长进程 需要root权限(nbuntu不需要) 新会话丢弃原有的控制终 ...

  3. Linux系统编程18:超详解进程程序替换exec函数的一些用法

    文章目录 (1)进程程序替换是什么 (2)exec-替换函数 (3)实例展示-了解exec函数的替换原理 A:execl和execv B:execlp和execvp C:替换自己的程序和execle ...

  4. Linux系统编程总结

    day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...

  5. 【README】Linux系统编程必读:本专栏内容提要以及系统调用接口总结

    文章目录 前言 第一部分:博客知识点 (1)基础篇 Linux系统编程1:Linux中使用率最高的一些命令 Linux系统编程2:详解Linux中的权限问题 Linux系统编程3:基础篇之详解Linu ...

  6. Linux系统编程(一)

    Linux系统编程(一) 一.进程和程序 二.内存布局 内核空间 用户空间 三.进程状态 四.环境变量 五.进程共享 一.进程和程序 程序:是指编译好的二进制文件,存储在磁盘中,不占用系统资源. 进程 ...

  7. 【Linux系统编程学习】匿名管道pipe与有名管道fifo

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...

  8. 【Linux系统编程】特殊进程之僵尸进程

    00. 目录 文章目录 00. 目录 01. 僵尸进程概述 02. 僵尸进程案例 03. 避免僵尸进程 04. 附录 01. 僵尸进程概述 进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵 ...

  9. Linux系统编程(二)孤儿进程和僵尸进程

    Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...

  10. Linux系统编程 74 孤儿进程和僵尸进程

    Linux系统编程  74 孤儿进程和僵尸进程 学习笔记 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init进程,称为init进程领养了孤儿进程. init进程会去接替 ...

最新文章

  1. swoole 要求php版本,swoole哪个版本支持php5
  2. 方法重写(override)注意事项和使用细节
  3. css img重复_20 个 CSS 快速提升技巧
  4. linux 进程带宽限制,在Linux中限制网络带宽使用
  5. QuickBI助你成为分析师-邮件定时推送
  6. jzoj3889-序列问题【dp,高精度】
  7. python 不显示前几个字符_「Python 秘籍」删除字符串中不需要的字符
  8. android platform下载地址
  9. coreseek实时索引更新之增量索引
  10. Matlab求矩阵均值
  11. 区块链 以太坊 多层调用,获取调用者 msg.sender
  12. Kaldi-Timit 训练
  13. Telegram附近的人功能存在安全风险,可被用于探测用户位置
  14. 数据通信之信道与编码
  15. 超市收银系统服务器搭建教程,超市收银系统快速收银步骤? 你需要学习了
  16. 解决执行力问题的思路
  17. 22.1.4猫和老鼠
  18. unity--google支付--billing4.0
  19. CnOpenData中国发明授权专利信息数据
  20. 有什么项目工时管理工具?

热门文章

  1. 美图秀秀 Mac版终于上线 关于美图秀秀 Mac版初体验
  2. 《深入浅出程序设计竞赛(基础篇)》第1部分 语言入门 第3章 分支结构程序设计
  3. P2651 添加括号III(python3实现)
  4. 使用百度webuploader插件进行多文件类型分片上传实例
  5. settimeout需要清除吗_前端20个真正灵魂拷问,前端初级到中级你还需要这个!
  6. RTX5 | 软件定时器02 - 创建一个软件定时器(连续运行)
  7. Java工作笔记-类型转换的一种思路(前后端分离、反射)
  8. Qt工作笔记-Qt仿大佬使用关键字(Q_DECL_OVERRIDE与override)
  9. bat 修改txt_善用bat命令提高办公效率
  10. c语言缓冲池管理算法,操作系统复习资料