进程:守护进程

159 阅读2分钟

基本概念

  • 进程组:是一组相关进程的集合,共享同一进程组标识符(PGID)
    • 进程组首进程:该进程是创建该组的进程,其进程 ID 为该进程组的 ID
    • 新进程会继承其父进程所属的进程组 ID
    • 生命周期:其开始时间为首进程创建组的时刻,结束时间为最后一个 成员进程退出组的时刻
  • 会话:是一组相关进程组的集合。
    • 会话首进程是创建该新会话的进程,其进程 ID 会成为会话 ID
    • 新进程会继承其父进程的会话 ID
  • 任一时刻,会话中的其中一个进程组会成为终端的前台进程组,其他进程组会成为 后台进程组。只有前台进程组中的进程才能从控制终端中读取输入。

系统调用

◼ 进程组:pid_t getpgrp(void);
◼ 进程组:pid_t getpgid(pid_t pid);
◼ 进程组:int setpgid(pid_t pid, pid_t pgid); 
◼ 会话:pid_t getsid(pid_t pid);
◼ 会话:pid_t setsid(void);

守护进程(Daemon 进程、精灵进程)

  • Linux 后台服务进程
  • 生命周期很长:守护进程会在系统启动的时候被创建并一直运行直至系统被关闭
  • 它在后台运行并且不拥有控制终端
  • Linux 的大多数服务器就是用守护进程实现的。
    • Internet 服务器 inetd
    • Web 服务器 httpd
    • ssh 协议 sshd

守护进程的创建步骤

  • 执行一个 fork(),之后父进程退出,子进程继续执行。
    • 确保子进程不会成为进程组的首进程。
  • 子进程调用 setsid() 开启一个新会话。
    • 目的:脱离控制终端。创建新会话没有控制终端。
  • 清除进程的 umask 以确保当守护进程创建文件和目录时拥有所需的权限。
    • 非必需。
  • 修改进程的当前工作目录,通常会改为根目录(/)。
    • 非必需。
  • 关闭守护进程从其父进程继承而来的所有打开着的文件描述符。
    • 非必需。
  • 在关闭了文件描述符0、1、2之后,守护进程通常会打开/dev/null 并使用dup2() 使所有这些描述符指向这个设备。
    • 非必需。
  • 核心业务逻辑