守护进程深度分析

思考

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

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

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

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

一些相关推论

新会话关联控制终端后,会话中所有进程生命期与控制终端相关

只有会话首进程能够关联控制终端 (会话中的其他进程不行)

进程的标准输入输出与标准错误输出可以进程重定向

  • 由描述符 0,1,2 决定重定向的目标位置 (按顺序打开设备)
  • 控制终端与进程的标准输入输出以及标准错误输出无直接关系

一个大胆的想法

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

代码示例

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

会话与终端深度实验

什么是守护进程 (Daemon) ?

守护进程是系统中执行任务的后台进程

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

守护进程的创建步骤

1、通过 fork() 创建新进程,成功后,父进程退出

2、子进程通过 setsid() 创建新会话

3、子进程通过 fork() 创建孙进程 (肯定不是会话首进程)

4、孙进程修改模式 umask(),改变工作目录为 "/"

5、关闭标准输入输出和标准错误输出

6、重定向标准输入输出和标准错误输出 ("/dev/null")

守护进程深度分析_第3张图片

守护进程关键点分析

父进程创建子进程是为了创建新会话

子进程创建孙进程是为了避免产生控制进程

孙进程不是会话首进程,所以不能关联终端

重定向操作可以避开奇怪的进程输出行为

创建守护进程

你可能感兴趣的:(Linux系统编程,linux)