Linux 守护进程



1.概念:

        在linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。

     守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件守护进程是一种很有用的进程。Linux 的大多数服务器就是用守护进程实现的。比如,Internet 服务器inetdWeb服务器 httpd 等。同时,守护进程完成许多系统任务。比如,作业规划进程 crond等。

     linux 系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程(Daemon)。

     守护进程脱离于终端并且在后台运行,它脱离终端的目的是为了避免进程在运行过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出(当然可以认为杀死相应的守护进程)。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。

2.如何创建:

1.调用 umask  将文件模式创建屏蔽字设置为 0。

2.调用 fork,父进程退出(exit)。

  原因:1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得 shell认为该命令已经执行完毕。

      2)保证子进程不是一个进程组的组长进程。

3.调用 setsid创建一个新会话。setsid 会导致:1)调用进程成为新会话的首进程。

                             2)调用进程成为一个进程组的组长进程 。

                             3)调用进程没有控制终端。(再次 fork  一次,保证 daemon进程,之后不会打开 tty设备)

进程组:是一个或多个进程的集合。进程组有进程组 ID来唯一标识。除了进程号(PID)之外,进程组 ID也是一个进程的必备属性。每个进程组都有一个组长进程,其组长进程的进程号等于进程组 ID。且该进程组 ID 不会因组长进程的退出而受到影响。

4.将当前工作目录更改为根目录。通常的做法是让“/”作为守护进程的当前目录,当然也可以指定其他的别的目录来作为守护进程的工作目录。

5.关闭不再需要的文件描述符。如果不进行闭的话将会浪费系统的资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。

6.其他:忽略 SIGCHLD 信号。

3.举例:

第一次fork:

Linux 守护进程_第1张图片Linux 守护进程_第2张图片

第二次fork:

Linux 守护进程_第3张图片Linux 守护进程_第4张图片

Linux 守护进程_第5张图片

fork两次的作用:

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

    第二次 fork 2 fork不是必须的fork第二次主要目的是防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长,再fork 一次,子进程ID != sidsid是进程父进程的 sid)。所以也无法打开新的控制终端。

你可能感兴趣的:(Linux 守护进程)