目录
一、僵尸进程
子进程已经执行完毕但是父进程并没有进行正确的回收,导致子进程的残留资源存放于内核中就形成了僵尸进程。
僵尸进程是不会占用任何系统资源的,那么为什么要清楚掉僵尸进程呢?
- 僵尸进程会占用进程表中的一个条目,如果进程表耗尽会导致无法创建新的进程,系统瘫痪。
- 出现僵尸进程也有可能是父进程出现了崩溃、死锁等问题,可能会导致父进程无法正常运行。
- 僵尸进程会将系统资源长时间占用,造成系统资源浪费和性能下降。
如何结束僵尸进程?
- kill -9 命令:使用kill -9命令可以强制结束进程。但是,这种方法会导致进程无法正常释放资源,可能会造成数据丢失或损坏。因此,应该谨慎使用。
- kill -SIGCHLD 命令:使用kill -SIGCHLD命令可以让父进程重新处理僵尸进程。当父进程收到SIGCHLD信号时,它会调用wait()或waitpid()来回收僵尸进程的资源。
- 设置系统参数:可以设置系统参数,限制每个用户可以创建的最大进程数,让系统自动回收僵尸进程。
- 使用wait和waitpid函数:可以在父进程中使用wait或waitpid函数等待子进程终止,并获取其终止状态,以清理僵尸进程。
二、孤儿进程
孤儿进程是指其父进程已经终止,但它仍然在运行的进程。
- 当一个进程终止时,它的所有子进程将被init进程(进程ID为1)收养,成为孤儿进程。孤儿进程不会影响系统的稳定性和安全性,因为它们会被init进程管理和回收。但是,如果孤儿进程数量过多,可能会导致系统资源的浪费。
- 通常情况下,不需要特别处理孤儿进程。但是,如果需要监控和控制孤儿进程,可以使用ps、top、pgrep等命令来查看系统中的孤儿进程,并使用kill命令结束它们。
- 为了避免产生过多的孤儿进程,可以在编写程序时,确保父进程在结束之前,正确地等待并回收其所有子进程。可以使用wait、waitpid和wait3等函数来等待子进程结束,并获取其退出状态。
三、守护进程
- 守护进程(Daemon Process)是一种特殊的后台进程,它在系统引导时启动,并一直运行直到系统关闭。
- 守护进程通常独立于终端并且没有控制终端,它们通常被用来执行系统级任务,如监控系统状态、提供网络服务等。
- 一个守护进程的父进程是init进程,因为他真正的父进程再fork出子进程后就先于子进程exit退出了,所以它是由init继承的孤儿进程。
1. 常见的守护进程
- syslogd:系统日志守护进程,用于收集和记录系统事件信息。
- cron:计划任务守护进程,用于执行定期任务。
- sshd:安全外壳守护进程,用于提供远程登录服务。
- httpd:Apache网页服务器守护进程,用于提供HTTP服务。
- named:域名系统守护进程,用于解析域名。
2.编写守护进程的步骤
- 父进程中执行fork并exit退出
- 在子进程中调用setsid函数创建新的会话
- 在子进程中调用chdir函数,让根目录成为子进程的工作目录
- 在子进程中调用umask函数,设置进程的umask为0
- 在子进程中关闭任何不需要的文件描述符
创建守护进程主要是为了让程序在后台长期稳定运行,提供系统级服务,且易于管理和监控。它独立于父进程与终端,较为稳定高效。
四、进程回收
当进程终止时,操作系统释放该进程使用的系统资源,以便为其他进程提供资源使用。
- 如果是正常退出,父进程调用wait()或waitpid()系统调用进行资源回收。
- 如果是非正常退出,init进程负责回收子进程资源(僵尸进程)。
- 内核也会定期扫描并处理未回收的僵尸进程。
注意:一次 wait 或 waitpid 调用只能清理一个子进程,清理多个子进程应使用循环。