Linux系统编程——僵尸的模拟以及僵尸进程的预防
僵尸进程介绍
子进程终止,父进程尚未回收,子进程残留资源(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系统编程——僵尸的模拟以及僵尸进程的预防相关推荐
- linux终端和执行进程的关系,Linux系统编程第04期:打通进程与终端的任督二脉
本课程是<嵌入式工程师自我修养>自学教程六步走中的第3步:Linux系统编程第04期. 进程,是Linux系统中任务调度运行的基本单元:一个程序的运行,都要被操作系统包装成"进程 ...
- Linux系统编程---11(会话,守护进程,创建守护进程)
会话 创建会话 创建一个会话需要注意以下6点注意事项 调用进程不能是进程组组长,该进程变成新会话首进程 该进程成为一个新进程组的组长进程 需要root权限(nbuntu不需要) 新会话丢弃原有的控制终 ...
- Linux系统编程18:超详解进程程序替换exec函数的一些用法
文章目录 (1)进程程序替换是什么 (2)exec-替换函数 (3)实例展示-了解exec函数的替换原理 A:execl和execv B:execlp和execvp C:替换自己的程序和execle ...
- Linux系统编程总结
day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末 ...
- 【README】Linux系统编程必读:本专栏内容提要以及系统调用接口总结
文章目录 前言 第一部分:博客知识点 (1)基础篇 Linux系统编程1:Linux中使用率最高的一些命令 Linux系统编程2:详解Linux中的权限问题 Linux系统编程3:基础篇之详解Linu ...
- Linux系统编程(一)
Linux系统编程(一) 一.进程和程序 二.内存布局 内核空间 用户空间 三.进程状态 四.环境变量 五.进程共享 一.进程和程序 程序:是指编译好的二进制文件,存储在磁盘中,不占用系统资源. 进程 ...
- 【Linux系统编程学习】匿名管道pipe与有名管道fifo
此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...
- 【Linux系统编程】特殊进程之僵尸进程
00. 目录 文章目录 00. 目录 01. 僵尸进程概述 02. 僵尸进程案例 03. 避免僵尸进程 04. 附录 01. 僵尸进程概述 进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵 ...
- Linux系统编程(二)孤儿进程和僵尸进程
Linux系统编程(二) 一.exec函数族 1.exec函数 二.孤儿进程和僵尸进程 三.wait和waitpid 1.wait函数 2.waitpid函数 一.exec函数族 exec函数使用时, ...
- Linux系统编程 74 孤儿进程和僵尸进程
Linux系统编程 74 孤儿进程和僵尸进程 学习笔记 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init进程,称为init进程领养了孤儿进程. init进程会去接替 ...
最新文章
- swoole 要求php版本,swoole哪个版本支持php5
- 方法重写(override)注意事项和使用细节
- css img重复_20 个 CSS 快速提升技巧
- linux 进程带宽限制,在Linux中限制网络带宽使用
- QuickBI助你成为分析师-邮件定时推送
- jzoj3889-序列问题【dp,高精度】
- python 不显示前几个字符_「Python 秘籍」删除字符串中不需要的字符
- android platform下载地址
- coreseek实时索引更新之增量索引
- Matlab求矩阵均值
- 区块链 以太坊 多层调用,获取调用者 msg.sender
- Kaldi-Timit 训练
- Telegram附近的人功能存在安全风险,可被用于探测用户位置
- 数据通信之信道与编码
- 超市收银系统服务器搭建教程,超市收银系统快速收银步骤? 你需要学习了
- 解决执行力问题的思路
- 22.1.4猫和老鼠
- unity--google支付--billing4.0
- CnOpenData中国发明授权专利信息数据
- 有什么项目工时管理工具?
热门文章
- 美图秀秀 Mac版终于上线 关于美图秀秀 Mac版初体验
- 《深入浅出程序设计竞赛(基础篇)》第1部分 语言入门 第3章 分支结构程序设计
- P2651 添加括号III(python3实现)
- 使用百度webuploader插件进行多文件类型分片上传实例
- settimeout需要清除吗_前端20个真正灵魂拷问,前端初级到中级你还需要这个!
- RTX5 | 软件定时器02 - 创建一个软件定时器(连续运行)
- Java工作笔记-类型转换的一种思路(前后端分离、反射)
- Qt工作笔记-Qt仿大佬使用关键字(Q_DECL_OVERRIDE与override)
- bat 修改txt_善用bat命令提高办公效率
- c语言缓冲池管理算法,操作系统复习资料