10 - 守护进程深度分析

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)Linux系统编程训练营 - 目录

文章目录

  • 1. 会话与终端的关联
    • 1.1 思考
    • 1.2 新会话关联控制终端的方法
    • 1.3 一些相关推论
    • 1.4 一些想法
    • 1.5 编程实验:会话与终端
  • 2. 守护进程要点分析
    • 2.1 什么是守护进程(Daemon)
    • 2.2 守护进程的创建步骤
    • 2.3 守护进程的创建步骤流程图
    • 2.4 守护进程关键点分析
    • 2.5 编程实验:创建守护进程

1. 会话与终端的关联

1.1 思考

  • 代码中创建的会话,如何关联 控制终端?

1.2 新会话关联控制终端的方法

会话首进程成功打开终端设备(设备打开前处于空闲状态)

  1. 关闭标准输入输出和标准错误输出
  2. 将stdin关联到终端设备:STDIN_FILENO ==> 0
  3. 将stdout关联到终端设备:STDOUT_FILENO ==> 1
  4. 将stderr关联到终端设备:STDERR_FILENO ==> 2

1.3 一些相关推论

  • 新会话 关联 控制终端 后,会话中的 所有进程 生命期控制终端 相关
  • 只有 会话首进程 能够关联控制终端(会话中的其它进程不行)
  • 进程的标准输入输出与标准错误输出可以进行 重定向
    • 由描述符 0, 1, 2 决定重定向的目标位置(按顺序打开设备)
    • 控制终端与进程的标准输入输出以及标准错误输出无直接关系

1.4 一些想法

10 - 守护进程深度分析_第1张图片
10 - 守护进程深度分析_第2张图片

1.5 编程实验:会话与终端

【参看链接】:10 - 守护进程深度分析 / 00会话与终端

10 - 守护进程深度分析_第3张图片
10 - 守护进程深度分析_第4张图片
10 - 守护进程深度分析_第5张图片

2. 守护进程要点分析

2.1 什么是守护进程(Daemon)

  • 守护进程是系统中执行任务的 后台进程
    • 不与任何终端相关联(不接收终端相关的信号)
    • 生命周期长,一旦启动,正常情况下不会终止(直到系统退出)
    • Linux大多数 服务器 使用守护进程实现(守护进程名以 后缀d 结尾)

2.2 守护进程的创建步骤

  1. 通过 fork() 创建新进程,成功后,父进程退出
  2. 子进程通过 setsid() 创建新会话
  3. 子进程通过 fork() 创建孙进程(肯定不是会话首进程)
  4. 孙进程修改模式 umask(),改变工作目录为 “/”
  5. 关闭标准输入输出和标准错误输出
  6. 重定向标准输入输出和标准错误输出(“/dev/null”)

2.3 守护进程的创建步骤流程图

10 - 守护进程深度分析_第6张图片

2.4 守护进程关键点分析

  • 父进程创建子进程是为了创建新会话
  • 子进程创建孙进程是为了 避免产生 控制进程
  • 孙进程不是会话首进程,因此不能关联终端
  • 重定向操作可以避开奇怪的进程输出行为

2.5 编程实验:创建守护进程

【参看链接】:10 - 守护进程深度分析 / 01守护进程 / first-d.c
10 - 守护进程深度分析_第7张图片
10 - 守护进程深度分析_第8张图片

  没有孙进程中的打印信息不太合理,因为在一些情况下,我们还是需要查看守护进程的一些打印数据。我们可以将原本重定向到“/dev/null”的输出,重新重定向到其它文件:

10 - 守护进程深度分析_第9张图片
10 - 守护进程深度分析_第10张图片

你可能感兴趣的:(Linux系统编程训练营,linux,c语言,开发语言,Linux系统编程)