linux守护进程介绍以及如何编写守护进程

来源:互联网 发布:软件架构怎么设计 编辑:程序博客网 时间:2024/05/16 06:55

守护进程介绍:

linux中的守护进程是一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些事件的发生。
linux中大多数服务器就是守护进程实现的。例如: internet服务器中inetd, Web服务器中的http。守护进程也完成一些系统任务如作业规划进程crond。
linux启动时会启动很多系统服务进程,这些进程没有控制终端,无法直接和用户交互。其他进程都是在用户登陆时启动,用户注销时退出,但系统服务进程不受用户的登录或注销改变影响,一直运行着。这种进程有一个名字叫守护进程(Daemon)。
用 ps ajx命令可以查看系统中的进程。
这里写图片描述
TPGID 一栏是-1都是没有控制终端的进程,也就是守护进程。
COMMAND一栏中用[]括起来的表示内核线程。没有空间代码,没有程序名和命令行。


创建函数

pit_t setsid(void);

创建一个守护进程的6个步骤:

  1. 调用umask将文件模式创建屏蔽字设为0。
  2. 调用fork,父进程退出。(1)如果进程是由shell命令启动的,退出父进程,shell认为该进程已经结束。(2)保证子进程不是一个进程组组长。
  3. 调用setsid函数创建一个新的会话。(1)调用进程会成为新会话的首进程。(2)调用进程会成为进程组组长。(3)调用进程没有控制终端。
  4. 将当前目录改为工作目录。
  5. 关闭不需要的文件描述符。
  6. 忽略SIGCHLD信号。

两次fork的作用
第一次fork:这里第一次fork的作用就是让shell认为这条命令已经终止,不用挂在终端输入上;再一个是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长(会报错Operation not permitted),如果不fork子进程,那么此时的父进程是进程组组长,无法调用setsid。所以到这里子进程便成为了一个新会话组的组长。

第二次fork:第二次fork是为了避免后期进程误操作而再次打开终端。因为打开一个控制终端的前提条件是该进程必须为会话组组长,而我们通过第二次fork,确保了第二次fork出来的子进程不会是会话组组长。

程序代码:
这里写图片描述
这里写图片描述
这里写图片描述
程序正确执行后:

  • 创建一个会话,当前进程成为会话首进程,会话ID就是当前进程ID。
  • 创建一个新的进程组,当前进程就是组长进程,进程组ID就是当前进程ID。
  • 如果当前进程有一个控制终端,则该进程失去控制终端,成为没有控制终端的进程。
    再次用命令ps ajx 查看进程发现多了几个守护进程。
    这里写图片描述