Operating system 守护进程和正常进程之间的行为差异是什么?

Operating system 守护进程和正常进程之间的行为差异是什么?,operating-system,process,daemon,Operating System,Process,Daemon,我知道守护进程主要在后台运行,也就是说,它们需要的用户交互很少 通常存在的某些类型的守护程序: 脱离控制tty 成为会议主持人 成为流程组长 通过分叉和退出(一次或两次)停留在后台。这有时是流程成为会话负责人所必需的。它还允许父进程继续正常执行。这个成语有时用“叉开然后死去”来概括 将根目录(“/”)设置为当前工作目录,以便进程不会保留已装入文件系统中的任何正在使用的目录(允许将其卸载) 将umask更改为0以允许open()、creat()等调用提供自己的权限掩码,而不依赖调用者的umask

我知道守护进程主要在后台运行,也就是说,它们需要的用户交互很少

通常存在的某些类型的守护程序:

  • 脱离控制tty
  • 成为会议主持人
  • 成为流程组长
  • 通过分叉和退出(一次或两次)停留在后台。这有时是流程成为会话负责人所必需的。它还允许父进程继续正常执行。这个成语有时用“叉开然后死去”来概括
  • 将根目录(“/”)设置为当前工作目录,以便进程不会保留已装入文件系统中的任何正在使用的目录(允许将其卸载)
  • 将umask更改为0以允许open()、creat()等调用提供自己的权限掩码,而不依赖调用者的umask
  • 在执行时关闭父进程保持打开状态的所有继承打开的文件,包括文件描述符0、1和2(stdin、stdout、stderr)。所需文件将稍后打开
  • 使用日志文件、控制台或/dev/null作为stdin、stdout和stderr

我想知道,除了我在第一行中提到的那个进程外,守护进程中的行为是否与正常进程有所不同。这两种流程都执行其工作,并根据用户完成工作所需的交互量与用户交互


守护进程还有比这更多的功能吗?

没有。守护进程只是连续运行的进程的一个术语,通常不连接到终端

守护进程不是一个单独的进程类,它们没有特权或属性


有一个BSD/LinuxC函数叫做
守护进程
(),但这实际上是一种将进程与其终端分离的简单方法。之所以这样命名,是因为守护进程通常都是这样做的,而不是相反。

这个问题有点模糊,但我还是会试试:

从技术上讲,守护进程和其他进程一样。它们通常(但不是必须)关闭misc文件描述符,以及其他适合长时间运行的进程的行为。要从较高的层次了解大多数守护进程是如何设置的(在Python中),请查看:


因此,差异实际上可以归结为生命周期和用户。守护进程的生存时间很长,通常与给定的运行级别一样长。它们通常还向其他系统范围的进程或高于平均用户运行进程的进程提供服务。

进程和守护进程之间的关键区别在于守护进程的父进程是init——在*Nix引导期间启动的第一个进程。这就是守护进程没有连接到终端的原因。因此,当您关闭终端时,它不会被操作系统杀死。但您仍然可以向您的守护进程发送信号。

我不会说它们通常是系统范围的,它们也可以是给定用户会话的本地。因此,如果我从shell(如
$process&
)执行一个进程,它是否符合守护进程的条件?我会说不,这只是一个后台进程。它仍然与您的终端相关联,即使它的输出被暂时抑制,并且如果程序无限期运行,它很可能是在考虑交互的情况下编写的。守护进程会自动从启动它的终端分离,并以非交互性的方式写入。您可以启动或停止守护进程。甚至创建新的守护进程。它们不一定是由init启动的。