这是我参与「第五届青训营 」伴学笔记创作活动的第 1天
1.3.1 孤儿进程、僵尸进程、守护进程的概念 ⭐⭐⭐⭐⭐****
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程所收养,并由 init 进程对它们完成状态收集工作。****
一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。****
但是对于父进程的等待方式存在两种:阻塞式等待和非阻塞式等待,可以通过 wait 和 waitpid 这两个系统调用来实现,对于父进程而言,阻塞式等待( wait )让父进程停下自己手头上的事情,专心的等待子进程退出,这严重影响了父进程的工作;而对于非阻塞式等待 (waitpid) ,父进程每隔一段时间都要轮循一下,看看子进程有没有退出****
waitpid() :一个进程可以通过调用 waitpid 函数来等待它的子进程终止或者停止****
while ((childpid = waitpid(-1, &status, WNOHANG)) > 0)
{
// 如果是正常退出,不需要重启子进程 如果是被 SIGKILL 信号结束的,也不重启子进程
if (WIFEXITED(status) || (WIFSIGNALED(status) && WTERMSIG(status) == SIGKILL))
restart = false;
}
一个进程在终止的时候会关闭所有的文件描述符,释放在用户空间分配的内存,但是它的 PID 还保留着,内核在其中保存了一些信息:如果进程是正常终止则保存进程退出状态;如果进程是异常终止,则保存导致该进程终止的那个信号。这个进程的父进程可以调用 wait() 或者 waitpid() 来获取这些信息,然后彻底清除这个进程。****
Linux Daemon (守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。****