关于创建UNIX/Linux daemon进程的笔记

Linux daemon程序简单说就是Linux后台服务进程。

传统的、标准的创建方法:2次fork + setsid

详细步骤

  1. 进程1(父进程)调用fork,创建子进程2,进程1退出。

    1)这个步骤是为第二部做铺垫。

    2)此时,进程1是进程组组长,调用setsid会失败,即无法创建新会话。

  2. 进程2,调用setsid,创建新会话session,目的是脱离进程1所在的session(通常是shell)。

    1)新创建的进程2,不是组长,可以通过setsid创建新会话。进程2不是组长的原因,是因为继承了父进程进程1的pgid(进程1的pid),不是进程2自身pid。

    2)目标是创建一个新session,脱离原来的session。

    3)这样,原session的状态不会影响到daemon进程。

    4)此时进程2是progress group和session的组长,可以获取终端(/dev/tty)。

    如果拥有终端,就会收到终端生命周期的影响,可能收到SIGHUP信号。

    要让daemon断绝一切杂念。

  3. 进程2再次调用fork,创建子进程3,进程2退出。

    1)进程2通过调用setsid成为进程组和session组长,通过fork由进程3继承了pgid和sid。

    2)这样进程3就不是进程组和session的组长,不能调用setsid。

    3)这样确保daemon进程无法获取/dev/tty。

    4)结果是既脱离了session,也脱离的terminal,减少了外部事件的影响。

总结:

(1) 上述几个步骤的目的是让进程脱离原session和terminal终端。

(2) 第一个fork是为调用setsid做准备,创建新session,脱离原session。副作用:成为session和进程组长。

(3)第二次fork是为了消除第二部副作用,不再是组长,不能获得terminal终端。

调用setsid的说明:

  1. 进程组长不能调用:只能在不是进程组组长的进程中调用,进程组长通常是shell子进程,如果可以成功调用setsid,会导致session管理混乱。在组长进程中调用setsid返回-1, EPERM。
  2. 断开原会话和终端:调用setsid后,会断开进程和已有控制终端terminal的关联,断开和原有会话的关联。
  3. 创建新会话并成为组长:成功调用setsid后,创建新会话,调用进程成为会话组长和进程组长。
  4. 在容器中,可能需要CAP_SYS_ADMIN能力,才能调用setsid
  5. 调用setsid,进程中所有线程都会同步切换到新会话,需要确认逻辑正确性。
  6. 通常和fork一起使用,确保子进程不是进程组长
  7. 和systemd的管理方式冲突,如果使用systemd管理的后台服务进程,不用fork+setsid方式创建daemon。
相关推荐
额额额对了10 分钟前
Linux 数据库开发实战:使用 C 语言与 SQLite3 构建轻量级终端词典
linux·数据库·oracle
爱笑鱼15 分钟前
Android 系统启动机制(六):Zygote 创建 App 为什么走 Socket?哪些是源码事实,哪些是架构解释?
android·linux
2601_9622998827 分钟前
Linux下运行Python脚本
linux·python·ubuntu·脚本·命令
Zenova EdgeOS31 分钟前
Linux eBPF 工业边缘性能观测实战
linux·服务器·网络
知产xiao_xin35 分钟前
《伯尔尼公约》—— 版权保护期
经验分享·笔记·知识产权
指针常量39 分钟前
【RL相关笔记】RL 效率综述
人工智能·笔记·大语言模型·后训练
STQY燊桐启元(深圳)电子科技1 小时前
5G 射频光模块场景,ST‑XDP 微波吸波导热垫片应用优势,对比 DP 导热硅胶片
经验分享·笔记·5g
skywalk81631 小时前
通过下载Ubuntu ova文件在Virtual Box快速安装ubuntu
linux·运维·ubuntu·virtualbox
AI视觉网奇1 小时前
blende 下载安装学习笔记
笔记·学习
wuminyu1 小时前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++