守护进程是什么?linux创建守护进程的步骤详解

守护进程是什么?可能很多伙伴对于守护进程都不怎么了解吧?守护进程是操作系统后台的一种特殊进程,像Linux系统的大多数服务器都是通过守护进程实现的 。今天小编就来给大家科普一下什么是守护进程以及linux系统如何创建守护进程 。

守护进程是什么?linux创建守护进程的步骤详解

文章插图
一、守护进程是什么?
Linux Daemon(守护进程)是运行在后台的一种特殊进程 。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件 。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务 。Linux系统的大多数服务器就是通过守护进程实现的 。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等 。
守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行 。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源 。
一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程 。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理 。
守护进程的名称通常以d结尾,比如sshd、xinetd、crond等
二、创建守护进程的步骤
首先我们要了解一些基本概念:
1、进程组 :
每个进程也属于一个进程组
每个进程主都有一个进程组号,该号等于该进程组组长的PID号。
一个进程只能为它自己或子进程设置进程组ID号
2、会话期:
会话期(session)是一个或多个进程组的集合 。
setsid()函数可以建立一个对话期:
如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期 。
(1)此进程变成该对话期的首进程
(2)此进程变成一个新进程组的组长进程 。
(3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除 。如果该进程是一个进程组的组长,此函数返回错误 。
(4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行
现在我们来给出创建守护进程的所需步骤:
编写守护进程的一般步骤:
(1)在父进程中执行fork并exit推出;
(2)在子进程中调用setsid函数创建新的会话;
(3)在子进程中调用chdir函数,让根目录 ”/” 成为子进程的工作目录;
(4)在子进程中调用umask函数,设置进程的umask为0;
(5)在子进程中关闭任何不需要的文件描述符
说明:
(1)在后台运行 。
为避免挂起控制终端将Daemon放入后台执行 。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行 。
if(pid=fork())
exit(0);//是父进程,结束父进程,子进程继续
(2)脱离控制终端,登录会话和进程组
有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID) 。登录会话可以包含多个进程组 。这些进程组共享一个控制终端 。这个控制终端通常是创建进程的登录终端 。
控制终端,登录会话和进程组通常是从父进程继承下来的 。我们的目的就是要摆脱它们,使之不受它们的影响 。方法是在第1点的基础上,调用setsid()使进程成为会话组长:

推荐阅读