💻
孤儿进程
(父进程死掉后还在执行自己任务的进程)
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程
(子进程结束,父进程不知道)
一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。
孤儿进程由于init进程有善后作用,所以孤儿进程没有什么危害,但是僵尸进程会造成资源浪费(子进程虽然运行实体已经消失,但是仍然在内核的进程表中占据一条记录,这样长期下去对于系统资源是一个浪费)。
僵尸进程处理
1、通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。调用wait()或者waitpid(),让父进程阻塞等待僵尸进程的出现,处理完在继续运行父进程。
2、杀死父进程
当父进程陷入死循环等无法处理僵尸进程时,强制杀死父进程,那么它的子进程,即僵尸进程会变成孤儿进程,由系统来回收。
3、重启系统
当系统重启时,所有进程在系统关闭时被停止,包括僵尸进程,开启时init进程会重新加载其他进程。
守护进程
守护进程就是在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,周期性地执行某项任务或等待处理某些发生的事件。它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务,习惯上守护进程的名字通常以d结尾(sshd)。守护进程一般会一直运行不会被中断,也就是说是一个死循环。