面试的时候呢, 有温柔小姐姐问我什么是孤儿进程, 守护进程. 我感觉自己就跟大禹一样, 三过问题而不入 … 在此提醒所有的小宝贝们, 记得看见什么知识就点进去看看, 说不定会有意外的收货呢?
1. 孤儿进程
如果一个父进程退出, 而它的一个或者多个子进程还在运行, 那么这些子进程将变成孤儿进程. 孤儿进程就将被 init 进程(进程号为 1)所收养, 并由 init 进程对它们完成状态收集工作.
由于孤儿进程会被 init 进程收养, 所以孤儿进程不会对系统造成危害
2. 僵尸进程
一个子进程的进程描述符在子进程退出时不释放, 只有当父进程通过 wait() 方法或者 waitpid() 获取了子进程信息后才会释放.
如果子进程退出了, 但是父进程并没有调用 wait() 方法或者 waitpid() 方法, 那么子进程的进程描述符仍然保存在系统中. 这种进程就称为僵尸进程.
可以通过 ps 命令查看僵尸进程, 僵尸进程显现出来的状态是 Z (zombie);
缺点:
系统所能使用的进程号是有限的, 如果大量的产生僵尸进程, 将会因为没有可用的进程号而导致系统不能产生新的进程.
消灭僵尸进程的方法:
只需要将父进程杀死, 这样这些僵尸进程就会变为孤儿进程, 从而被 init() 进程所收养, 这样 init 就会释放所有僵尸进程所占有的资源, 从而结束僵尸进程.
3. 守护进程
守护进程是运行在后台的一种特殊进程, 它独立于控制终端并且周期性地执行某种任务护着等待处理某些事件的发生. 它不需要用户的输入就可以运行而且提供某种服务, 不是对整个系统就是对某个用户提供服务.
Linux 系统的大多数服务都是有守护进程实现的, 常见的守护进程有: 系统日志进程syslogd, web服务器httpd, 邮件服务器sendmail 以及数据库服务器 mysqld 等.
守护进程一般在系统启动时开始运行, 除非强行终止, 否则直到系统关机都保持运行. 守护进程经常是以超级用户(root)权限运行, 因为它们要是用一些特殊的端口(1 - 1024)或访问某些特殊的资源.
一个守护进程的父进程是init进程,因为它真正的父进程在 fork 出子进程后就先于子进程 exit 退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备 stdout 还是标准出错设备 stderr 的输出都需要特殊处理。
守护进程的名称通常以d结尾,比如sshd、xinetd、crond等