• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

进程

wadec 2017-07-05 浏览量:613

什么是守护进程,如何来实现守护进程?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 守护进程,也就是通常所说的 Daemon 进程,是 Linux 中的后台服务进程。它是一个生存期较长的进程,
    通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导载
    入时启动,在系统关闭时终止。Linux  有很多系统服务,大多数服务都是通过守护进程实现的,如本书在
    第二章中讲到的多种系统服务都是守护进程。同时,守护进程还能完成许多系统任务,例如,作业规划进
    程 crond、打印进程 lqd 等(这里的结尾字母 d 就是 Daemon 的意思)。 
    由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附
    于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但
    是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才会退出。如果想让某个进
    程不因为用户、终端或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。可见,守护
    进程是非常重要的。 

    编写守护进程的五个步骤:
    1)创建子进程,父进程退出

    2)在子进程中创建新会话

    3)改变当前目录为根目录

    4)重设文件权限掩码

    5)关闭文件描述符


    下面是我以前写的源码: daemon.zip

    • 发布于 2017-07-05
    • 举报
    • 评论 0
    • 0
    • 0

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


    守护进程的更多信息请参考https://baike.so.com/doc/6165738-6378967.html


    关于如何实现守护进程

    一、将这个进程变为后台进程,不然你关掉终端就没法用了

    二、执行shopt | grep huponexit,确保这个huponexit处于off状态

     也可以使用Linux专用工具Systemd​来进行进程管理


    关于实现守护进程,可以参考一下这篇文章http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html​



    • 发布于2017-07-05
    • 举报
    • 评论 0
    • 0
    • 0

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


    守护进程的更多信息请参考https://baike.so.com/doc/6165738-6378967.html


    关于如何实现守护进程

    一、将这个进程变为后台进程,不然你关掉终端就没法用了

    二、执行shopt | grep huponexit,确保这个huponexit处于off状态

     也可以使用Linux专用工具Systemd​来进行进程管理


    关于实现守护进程,可以参考一下这篇文章http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html​



    • 发布于2017-07-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 您好,可參考這篇

    http://www.cnblogs.com/mickole/p/3188321.html

    一,守护进程概述

    Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。

    守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。

    一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。

    守护进程的名称通常以d结尾,比如sshd、xinetd、crond等

    二,创建守护进程步骤

    首先我们要了解一些基本概念:

    进程组 :

    • 每个进程也属于一个进程组
    • 每个进程主都有一个进程组号,该号等于该进程组组长的PID号 .
    • 一个进程只能为它自己或子进程设置进程组ID号

    会话期:

    会话期(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()使进程成为会话组长:
    setsid();
    说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。
    3. 禁止进程重新打开控制终端
    现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
    if(pid=fork())
    exit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长)
    4. 关闭打开的文件描述符
    进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:
    for(i=0;i 关闭打开的文件描述符close(i);>
    5. 改变当前工作目录
    进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如/tmpchdir("/")
    6. 重设文件创建掩模
    进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:umask(0);
    7. 处理SIGCHLD信号
    处理SIGCHLD信号并不是必须的。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN。
    signal(SIGCHLD,SIG_IGN);
    这样,内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

    以上

    • 发布于2017-07-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。
    用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键人的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。
    守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧急信息,都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd 守护进程。

    创建步骤:
    (1)创建子进程,终止父进程
    由于守护进程是脱离控制终端的,因此首先创建子进程,终止父进程,使得程序在shell终端里造成一个已经运行完毕的假象。之后所有的工作都在子进程中完成,而用户在shell终端里则可以执行其他的命令,从而使得程序以僵尸进程形式运行,在形式I上做到了与控制终端的脱离。
    (2)在子进程中创建新会话
    这个步骤是创建守护进程中最重要的一步,在这里使用的是系统函数setsid。
    setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid仃三个作用:让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制。
    在调用fork函数时,子进程全盘拷贝父进程的会话期(session,是一个或多个进程组的集合)、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来。setsid函数能够使进程完全独立出来,从而脱离所有其他进程的控制。
    (3)改变工作目录
    使用fork创建的子进程也继承了父进程的当前工作目录。由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。改变工作目录的常见函数是chdir。
    (4)重设文件创建掩码
    文件创建掩码是指屏蔽掉文件创建时的对应位。由于使用fork函数新建的子进程继承了父进程的文件创建掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件创建掩码设置为0,可以大大增强该守护进程的灵活性。设置文件创建掩码的函数是umask,通常的使用方法为umask(0)。
    (5)关闭文件描述符
    用fork新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的文件系统无法卸载。


    ​http://baike.baidu.com/link?url=VtyRqozAsi3QYi02wLK93o-X5Qfzec5I3dm6keKN3y-DAu933JxlFFgP4TFAy28iDbjt6rWqhI3kQUI7z7c3Q5dlH7g_9WC_fNjttxxgJa7KkYCY3fT0KfPFlq3qpPkM​

    • 发布于2017-07-05
    • 举报
    • 评论 0
    • 0
    • 0

  • 1、 守护进程的概念:
    守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,知道整个系统关闭才退出(当然可以认为的杀死相应的守护进程)。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。
     
    2、 守护进程实现的步骤:
    (1)   创建子进程,父进程退出(使子进程成为孤儿进程):这是编写守护进程的第一步,由于守护进程是脱离终端的,因此完成第一步后就会在shell终端里造成一个程序已经运行完毕的假象。之后的所有工作在子进程中完成,而用户在shell终端里则可以执行其他命令,从而在形式上做到了与控制终端脱离。实现的语句如下:if(pid=fork()){exit(0);}是父进程就结束,然后子进程继续执行。
     
    (2)   在子进程中创建新的会话(脱离控制终端):
     
    这步是创建守护进程中最重要的一步,虽然实现起来很简单,但是它的意义非常重要,在这里使用的是系统函数setsid()来创建一个新的会话,并且担任该会话组的组长。在这里有两个概念需要解释一下,进程组合会话期。
     
    进程组:是一个或多个进程的集合。进程组有进程组ID来唯一标识。除了进程号(PID)之外,进程组ID也是一个进程的必备属性。每个进程组都有一个组长进程,其组长进程的进程号等于进程组ID。且该进程组ID不会因组长进程的退出而受到影响。
     
    会话周期:会话期是一个或者多个进程的集合。通常一个会话开始于用户的登录,终止于用户的退出,在此期间该用户运行的所有进程都属于这个会话期。
    • 发布于2017-07-06
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

进程