思考
代码中创建的会话,如何关联控制终端?
新会话关联控制终端的方法
会话首进程成功打开终端设备 (设备打开前处于空闲状态)
- 1、关闭标准输入输出和标准错误输出
- 2、将 stdin 关联到终端设备:STDIN_FILENO => 0
- 3、将 stdout 关联到终端设备:STDOUT_FILENO => 0
- 4、将 stderr 关联到终端设备:STDERR_FILENO => 0
一些相关推论
新会话关联控制终端后,会话中所有进程生命期与控制终端相关
只有会话首进程能够关联控制终端 (会话中的其他进程不行)
进程的标准输入输出与标准错误输出可以进程重定向
- 由描述符 0,1,2 决定重定向的目标位置 (按顺序打开设备)
- 控制终端与进程的标准输入输出以及标准错误输出无直接关系
一个大胆的想法
代码示例
会话与终端深度实验
什么是守护进程 (Daemon) ?
守护进程是系统中执行任务的后台进程
- 不与任何终端相关联 (不接收终端相关的信号)
- 生命周期长,一旦启动,正常情况下不会终止 (直到系统退出)
- Linux 大多服务器使用守护进程实现 (守护进程名以后缀 d 结尾)
守护进程的创建步骤
1、通过 fork() 创建新进程,成功后,父进程退出
2、子进程通过 setsid() 创建新会话
3、子进程通过 fork() 创建孙进程 (肯定不是会话首进程)
4、孙进程修改模式 umask(),改变工作目录为 "/"
5、关闭标准输入输出和标准错误输出
6、重定向标准输入输出和标准错误输出 ("/dev/null")
守护进程关键点分析
父进程创建子进程是为了创建新会话
子进程创建孙进程是为了避免产生控制进程
孙进程不是会话首进程,所以不能关联终端
重定向操作可以避开奇怪的进程输出行为