首先介绍一下什么是僵死进程

int main()

{

int n = 0;

char *s = NULL;

pid_t pid = fork();

assert(pid != -1);

if(pid == 0)

{

n = 3;

int i = 0;

for(; i < n; i++)

{

sleep(1);

printf("child running\n");

}

}

else

{

n = 7;

int i = 0;

for(; i < n; i++)

{

sleep(1);

printf("parent running\n");

}

}

}

此时程序运行后,在子程序结束后,父进程尚且没有完成,此时查看一下进程信息,可以得到

可以看到两个signalttt进程,其中子程序的signalttt进程已经处于defunct状态,此时子进程已经代码执行完毕,但是这个进程并没有终止,这就对CPU的进程资源造成了很多的浪费,如果说短时间内产成了大量的僵死进程,那么此时因为进程号等信息占用,此时不能创建新的进程

为什么会出现僵死进程呢?

我们来改一下代码:

int main()

{

int n = 0;

char *s = NULL;

if(pid == 0)

{

n = 7;

int i = 0;

for(; i < n; i++)

{

sleep(1);

printf("child running\n");

}

}

else

{

n = 3;

int i = 0;

for(; i < n; i++)

{

sleep(1);

printf("parent running\n");

}

}

}

再次在运行途中查看ps

此时并没有和之前一样出现僵死进程,而我们仅仅是将子进程改的运行的时间比父进程长了一些,然后再次查看时候,发现僵死进程就消失了???

所以我们可以得到条件,僵死进程中,父进程一定要“活得久”~

这里本质上是因为,在Linux系统中,进程是有父子关系的,从init进程开始展开,是一个大的进程树,而子进程的结束都会由子进程向它的父进程发送一个信号(SIGCHLD),而此时如果父进程在运行中没有获取子进程的退出码,这样就出现了僵死进程

关于僵死进程的处理

在Linux系统中有一个特殊的处理方法,signal(SIGCHLD,SIG_IGN);子进程在结束时候会向父进程发送一个子进程结束的信号,我们调用signal函数去忽略掉这个信号,那么这时候子进程就会变成了孤儿进程,会自动的被init接收处理,init进程会在进程表中挨个查找孤儿进程,也就是说,进程表越大那么这个过程造成的资源占用也就越多

也可以在父进程中用wait();函数,这样在执行到这句时,父进程会等待到子进程结束后,但是这句会造成父进程的挂起

同样的,也可以用signal(SIGCHLD,fun);去实现一个处理子进程信号的函数,让父进程接收到信号之后,调用wait()将子进程结束掉

还有一种特殊的是利用两次fork(),这样父进程在第一次创建的子进程1中,再次创建一个子进程2,子进程2负责执行子进程的工作,而子进程1只做一件事件--------wait(子进程2);专心致志等待子进程2结束,这样就处理了wait导致的进程挂起的问题

`

linux 僵死日志,关于僵死进程相关推荐

  1. linux查看php日志命令,linux查看日志的三种命令是什么,linux查看进程命令

    linux查看日志的三种命令是什么Linux查看日志的三个命令是什么,linux查看日志有三个命令:1.查看实时更改日志,代码为[tail-f filename]:2.搜索关键字附近的日志代码为[ca ...

  2. linux ps内存占用率,linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定...

    背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况. 一. linux ps命令,查看某进程cpu和内存占用率情况 [root@test vhost]# ps aux US ...

  3. Linux文件系统、虚拟内存、进程与线程、锁

    文章目录 文件系统 su Linux 中默认没有 super 命令 /proc /etc /var /root /home /bin /dev /lib /sbin tmp 句柄 maxfd PWD ...

  4. 十天学Linux内核之第二天---进程

    十天学Linux内核之第二天---进程 原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘 ...

  5. 操作系统(Linux与Windows)的进程管理

    进程 描述和管理程序的"运行过程"-------进程 进程概念 定义:进程是程序在某个数据集合上的一次运行活动 进程的特征 动态性 进程是程序的一次执行过程,动态产生消亡 并发性 ...

  6. Linux系统状态检测及进程控制--2

    Linux系统状态检测及进程控制--1(http://crushlinux.blog.51cto.com/2663646/836481) 4.僵死(进程已终止,但进程描述符存在,直到父进程调用wait ...

  7. linux内核设计与实现---进程管理

    进程管理 1 进程描述符及任务结构 分配进程描述符 进程描述符的存放 进程状态 设置当前进程状态 进程上下文 进程家族树 2 进程创建 写时拷贝 fork() vfork() 3 线程在Linux中的 ...

  8. Linux网络技术管理及进程管理(week2_day4)--技术流ken...

    Linux网络技术管理及进程管理(week2_day4)--技术流ken OSI七层模型和TCP/IP四层模型 OSI七层模型:OSI(Open System Interconnection)开放系统 ...

  9. 【linux基础】18、进程管理工具

    1.pstree 进程树查看 -p:并显示各进程的PID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...

最新文章

  1. 东南大学和山东大学计算机学院,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
  2. 弯曲传传感器 WWW.TE.COM
  3. excel插入一列日期 pandas_将日期和时间从Excel拉到Pandas并将其组合为时间戳
  4. python技巧:拆分多层嵌套列表
  5. C++面向接口编程和C++多态
  6. spring的controller是单例模式,但是是多线程,各个线程之间不影响
  7. Apache CarbonData 1.5.0编译及安装
  8. firefox flash-plugin怎样安装
  9. php 匹配双字节字符串,收集一些常用的正则表达式(匹配中文字符、匹配双字节字符、匹配HTML标记、匹配空行 and so on~~~)...
  10. Upload-Labs(6-10)
  11. python图像标记工具怎么用_一眼看穿的最佳图像标记工具!
  12. 大数据大屏设计-PS拉框助手
  13. 管家婆请确认输入正确的服务器名,管家婆辉煌II软件登录提示连接失败请确认输入正确的服务器名...
  14. WPF入门教程系列一——基础
  15. python 调用函数
  16. TeamTalk IM_PDUBASE详解
  17. MYSQL环境搭建(windows)
  18. 2021-03-17T23:47:55.978+08:00 UTC时间转换
  19. MacOs “无法打开***,因为无法验证开发者...”
  20. 网站SEO优化的一些知识分享

热门文章

  1. 图解常用的RAID 0, RAID 1, RAID 5, RAID 10
  2. 2017 CCPC final HDU - 6252 Subway Chasing (差分约束)
  3. 17 哈尔滨CCPC final J - Subway Chasing 差分约束
  4. 教你如何能够从小白快速入门MAYA,刚开始学习MAYA必看
  5. 最佳并发数和最大并发数
  6. python return怎么用,python return用法是什么
  7. 什么样的PDF转换成PPT转换器比较好
  8. 正则表达式高阶技巧之环视的组合(使用python实现)
  9. 被盲盒拯救的泡泡玛特:品控仍是老大难,消费者投诉不间断
  10. dhl:不用游标批量更新的SQL语句