---- 整理自狄泰软件唐佐林老师课程
查看所有文章链接:(更新中)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”的输出,重新重定向到其它文件: