---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)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 新会话关联控制终端的方法
会话首进程成功打开终端设备(设备打开前处于空闲状态)
- 关闭标准输入输出和标准错误输出
 - 将stdin关联到终端设备:STDIN_FILENO ==> 0
 - 将stdout关联到终端设备:STDOUT_FILENO ==> 1
 - 将stderr关联到终端设备:STDERR_FILENO ==> 2
 
1.3 一些相关推论
- 新会话 关联 控制终端 后,会话中的 所有进程 生命期 与 控制终端 相关
 - 只有 会话首进程 能够关联控制终端(会话中的其它进程不行)
 - 进程的标准输入输出与标准错误输出可以进行 重定向  
  
- 由描述符 0, 1, 2 决定重定向的目标位置(按顺序打开设备)
 - 控制终端与进程的标准输入输出以及标准错误输出无直接关系
 
 
1.4 一些想法

 
1.5 编程实验:会话与终端
【参看链接】:11 - 守护进程深度分析 / 00会话与终端

 
 
2. 守护进程要点分析
2.1 什么是守护进程(Daemon)
- 守护进程是系统中执行任务的 后台进程  
  
- 不与任何终端相关联(不接收终端相关的信号)
 - 生命周期长,一旦启动,正常情况下不会终止(直到系统退出)
 - Linux大多数 服务器 使用守护进程实现(守护进程名以 后缀d 结尾)
 
 
2.2 守护进程的创建步骤
- 通过 fork() 创建新进程,成功后,父进程退出
 - 子进程通过 setsid() 创建新会话
 - 子进程通过 fork() 创建孙进程(肯定不是会话首进程)
 - 孙进程修改模式 umask(),改变工作目录为 “/”
 - 关闭标准输入输出和标准错误输出
 - 重定向标准输入输出和标准错误输出(“/dev/null”)
 
2.3 守护进程的创建步骤流程图

2.4 守护进程关键点分析
- 父进程创建子进程是为了创建新会话
 - 子进程创建孙进程是为了 避免产生 控制进程
 - 孙进程不是会话首进程,因此不能关联终端
 - 重定向操作可以避开奇怪的进程输出行为
 
2.5 编程实验:创建守护进程
【参看链接】:11 - 守护进程深度分析 / 01守护进程 / first-d.c
 
 
没有孙进程中的打印信息不太合理,因为在一些情况下,我们还是需要查看守护进程的一些打印数据。我们可以将原本重定向到“/dev/null”的输出,重新重定向到其它文件:

 















