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

孤儿僵尸守护进程的简单理解

孤儿进程:

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。

如何模仿一个孤儿进程:  答案是:  kill 父进程

~$ kill -9 父进程号

原父进程:37860,执行~$ kill -9 37860 之后,父进程为:1

僵尸进程:

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

1. 僵尸进程怎样产生的:

 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。

在Linux进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装 SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了, 那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是 为什么系统中有时会有很多的僵尸进程。

2.怎么查看僵尸进程:

利用命令ps,可以看到有标记为<defunct>的进程就是僵尸进程。

ps -ef | grep test.exe(正在执行的程序)

3.怎样来清除僵尸进程:

改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用 wait,内核也会向它发送SIGCHLD消息,尽管对默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。

把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。它产生的所有僵尸进程也跟着消失。

守护进程(daemon):

守护进程是生存期长,不与任何终端关联的进程。通常情况下守护进程在系统启动时就在运行,仅在系统关闭时才终止。它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务。守护进程脱离于终端,是为了避免进程在执行过程中的信息在任何终端上显示,并且进程也不会被任何终端所产生的终端信息所打断(比如关闭终端等)。

注意:

大多数守护进程都以超级用户(root)特权运行,所有的守护进程都没有控制终端。最后应当引起注意的是用户层守护进程的父进程是init进程。

如何成为一个守护进程步骤如下:

1.调用fork(),创建新进程,它会是将来的守护进程。
2.在父进程中调用exit,保证子进程不是进程组长。

3.调用setsid()创建新的会话区

4.将当前目录改成目录(如果把当前目录作为守护进程的目录,当前目录不能被卸载他作为守护进程的工作目录)

5.将标准输入,标输出,标准错误重定向到/dev/null.

http://www.lryc.cn/news/158898.html

相关文章:

  • 学习笔记——Java入门第一季
  • 更改注册表exe值后的惨痛经历
  • stable diffusion实践操作-LyCORIS
  • 无需公网IP教你如何外网远程访问管家婆ERP进销存
  • Swift使用编解码库Codable
  • Vue + Element UI 前端篇(三):工具模块封装
  • 【pytorch】数据加载dataset和dataloader的使用
  • 搭建单机版FastDFS分布式文件存储系统
  • 【验证码逆向专栏】房某下登录滑块逆向分析
  • Python 3.11 版本是对线程安全做了什么更改吗
  • 【Docker】镜像的创建、管理与发布
  • 移动硬盘或U盘无法弹出的解决方法
  • (leetcode1761一个图中连通三元组的最小度数,暴力+剪枝)-------------------Java实现
  • 【漏洞复现】金和OA C6任意文件读取漏洞
  • 2023年全国大学生数学建模B题
  • 【LeetCode】2651.计算列车到站时间
  • Redis——认识Redis
  • 通讯录怎么导入新手机?3个推荐小妙招
  • Geoserver发布shp、tiff、瓦片等格式的GIS数据
  • 读书笔记-《ON JAVA 中文版》-摘要24[第二十一章 数组]
  • go语言基本操作---五
  • 【sgLazyTree】自定义组件:动态懒加载el-tree树节点数据,实现增删改、懒加载及局部数据刷新。
  • Rust个人学习笔记
  • Java根据身份证号码提取出省市区,JSON数据格式
  • MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)
  • javaee 事务的传播行为
  • C#-SQLite-使用教程笔记
  • Tomcat详解 一:tomcat的部署
  • 算法 - 二分
  • 蠕虫病毒问题