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

守护进程、僵尸进程、孤儿进程

守护进程、僵尸进程、孤儿进程

守护进程(Daemon Process)

定义

守护进程又称Daemon进程(精灵进程),是Linux中的后台服务进程。
它的生命周期较长,通常独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件。

守护进程是一个特殊的孤儿进程,它是脱离终端的。
为什么要脱离终端呢?
脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。

查看守护进程使用ps axj

  • a 表示不仅列当前用户的进程,也列出所有其他用户的进程
  • x 表示不仅列有控制终端的进程,也列出所有无控制终端的进程
  • j 表示列出与作业控制相关的信息

创建守护进程

(1)让程序在后台执行。方法是调用fork()产生一个子进程,然后使父进程退出。

(2)调用setsid()创建一个新对话期。控制终端、登录会话和进程组通常是从父进程继承下来的,守护进程要摆脱它们,不受它们的影响,方法是调用setsid()使进程成为一个会话组长。setsid()调用成功后,进程成为新的会话组长和进程组长,并与原来的登录会话、进程组和控制终端脱离。

(3)禁止进程重新打开控制终端。经过以上步骤,进程已经成为一个无终端的会话组长,但是它可以重新申请打开一个终端。为了避免这种情况发生,可以通过使进程不再是会话组长来实现。再一次通过fork()创建新的子进程,使调用fork的进程退出。

(4)关闭不再需要的文件描述符。子进程从父进程继承打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。首先获得最高文件描述符值,然后用一个循环程序,关闭0到最高文件描述符值的所有文件描述符。

(5)将当前目录更改为根目录

(6)子进程从父进程继承的文件创建屏蔽字可能会拒绝某些许可权。为防止这一点,使用unmask(0)将屏蔽字清零。

(7)处理SIGCHLD信号。对于服务器进程,在请求到来时往往生成子进程处理请求。如果子进程等待父进程捕获状态,则子进程将成为僵尸进程(zombie),从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。这样,子进程结束时不会产生僵尸进程。

僵尸进程(Zombie Process)

定义

子进程先于父进程退出,且父进程没有调用wait/waitpid回收子进程的资源,此时,子进程就成为了僵尸进程。

僵尸进程的危害

  • 僵尸进程会长时间占用系统资源,严重时会耗尽系统的进程表资源,导致系统奔溃。
  • 如果僵尸进程过多会导致系统负载过高,降低系统的性能和响应速度。

如何避免僵尸进程

  • 父进程 通过wait()/waitpid() 等函数获取子进程的退出状态,从而将其彻底清除;

  • 父进程在fork()出子进程后,通过设置信号处理函数SIGCHLD,捕获到子进程的退出事件,通过wait()/waitpid()等函数获取其退出状态,从而消除僵尸进程;

  • 子进程可以在声明自己时调用signal(SIGCHLD, SIG_IGN)函数,使得该进程在退出时自动被父进程回收,而不会变成僵尸进程。

  • 使用进程间通信机制,如管道(pipe)、消息队列(message queue)、共享内存、套接字(socket)等,在子进程退出后,通过通信机制向父进程发送一个通知,父进程通过wait()/waitpid()等函数获取退出状态。

孤儿进程(Orphan Process)

父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程(Orphan Process)。

孤儿进程最终会被 init 进程(进程号为 1 )所收养,并由 init 进程对它们完成回收和释放资源。
每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init ,而 init 进程会循环地 wait() 它的已经退出的子进程。

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

相关文章:

  • 软件设计师笔记
  • 4_用dockerfile制作镜像
  • 肝一肝设计模式【四】-- 建造者模式
  • 从设计到产品
  • 《疯狂Python讲义》值传递的细节
  • 【7. ROS 中的 IMU 惯性测量单元消息包】
  • pcie m.2固态硬盘装机后无法识别到启动盘
  • Java Web应用开发 ——第四章:JavaBean技术测验
  • CTF权威指南 笔记 -第二章二进制文件- 2.4 -动态链接
  • C++:计算机操作系统:多线程:高并发中的线程
  • 大数据Doris(十一):Aggregate 数据模型
  • osg::Drawable类通过setDrawCallback函数设置回调函数的说明
  • Python基础合集 练习17(类与对象)
  • 再多猜一次就爆炸(小黑子误入)
  • 图像超分辨率简单介绍
  • 【Liunx】进程的程序替换——自定义编写极简版shell
  • c++标准模板(STL)(std::array)(三)
  • c#笔记-创建一个项目
  • Photoshop如何使用图像调色之实例演示?
  • IDEA中使用Git提交代码提示:您即将把CRLF行分隔符提交到Gt仓库。 建议将core.autocrlf Git特性设置为trUe,以免发生行分隔符问题。
  • ArduPilot之开源代码LibrarySketches设计
  • 第一章:概述
  • MySQL --- DDL图形化工具表结构操作
  • 归一化处理(2023寒假每日一题 14)
  • 无公网IP,外网远程连接MySQL数据库
  • OJ刷题 第十四篇(递归较多)
  • FileZilla读取目录列表失败(vsftpd被动模式passive mode部署不正确)
  • 【Java面试八股文】数据库篇
  • Android Glide加载图片、网络监听、设置资源监听
  • 等保定级报告模版