孤儿进程
父进程在子进程推退出之前就结束了自己的生命,此时的子进程叫做孤儿进程。
init进程会收留孤儿进程,变成孤儿进程的父进程,init进程的pid为1。
僵尸进程
如果子进程退出,而父进程fork()之前既没安装SIGCHLD信号处理函数,又没有显式忽略该信号,也没有调用waitpid()等待子进程结束,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程,这时用ps命令就能看到僵尸进程的状态是“Z”。
如果系统中存在大量的僵尸进程,他们的进程号就会一直被占用,但是系统所能使用的进程号是有限的,系统将因为没有可用的进程号而导致系统不能产生新的进程.。
避免僵尸进程的方法有以下几种:
- 通过 signal(SIGCHLD, SIG_IGN) 忽略SIGCHLD这个信号。
- 父进程主动调用 wait、waitpid等函数等待子进程结束,如果尚无子进程退出wait会导致父进程阻塞。
- 如果父进程很忙可以用注册一个SIGCHLD信号的处理函数,在信号处理函数调用wait、waitpid等待子进程退出。
- 杀死父进程。 如果僵尸进程的父进程还存在,找到这个父进程,kill掉它。这样就会变成2的情况,init或者 systemd会负责善后工作。
守护进程
守护进程就是在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务。