守护进程(Daemon Process)
【Linux】守护进程( Daemon)的定义,作用,创建流程_守护进程:运行在后台的一种特殊进程,独立于控制终端并周期性地执行某些任务。-CSDN博客
Linux系统编程——特殊进程之守护进程_禁止 子进程 集成 父进程 信号处理-CSDN博客
什么是守护进程,用在什么地方?
守护进程不受终端控制,其信息也不会在终端显示。
终端:启动进程的那个窗口,一般来说,进程会受该窗口的控制,该窗口关闭,进程也随之关闭。
从作用上看,该进程会守护其他进程,即周期性地执行某种任务或等待处理某些发生的事件。
常见的用途:系统服务,网络服务,日志记录
守护进程在系统的表现象
使用ps -axj
可以看到
- TTY(Teletypewriter):控制终端
- 守护进程没有控制终端,TTY为?
- PPID(Parent Process ID):父ID
- 守护进程父ID为1(所有进程的最初祖先)
- TPGID(thread group id):线程组 ID,即线程组组长的 PID,真正的进程 ID,如果进程只有一个线程则他的 PID 和 TGID 相同
- 守护进程TGID为-1
如何使用守护进程
- fork()创建子进程,父进程exit()退出
- 子进程会变为孤儿进程 ,挂到祖先那
- 在子进程中调用 setsid() 函数创建新的会话
- 设置新的会话ID -> 摆脱和当前窗口的联系
- 再次 fork() 一个孙进程并让子进程退出
- 再次退出父进程 -> 当前不再是会话的领导 永远不会受到窗口的影响
- 在孙进程中调用 chdir() 函数,让
根目录 ”/”
成为孙进程的工作目录 - 在孙进程中调用 umask() 函数,
设置进程的文件权限掩码为0
- 在孙进程中关闭任何不需要的文件描述符
- 处理信号
- 当用户需要外部停止守护进程运行时,往往会使用 kill 命令停止该守护进程。所以,守护进程中需要编码来实现 kill 发出的signal信号处理,达到进程的正常退出。
- SIGHUP:虽然守护进程和终端断开,但仍然有可能收到其它进程或内核发来的SIGHUP信号,守护进程不应该因为它而终止。