码迷,mamicode.com
首页 > 系统相关 > 详细

终端、作业控制与守护进程

时间:2016-05-10 07:23:57      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:守护   前台   

  1. 进程组、作业、会话


    1.1 进程组(Process Group)

    a. 每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。

    b. 每一个进程组有一个进程组id和一个组长进程,组长进程的id即为进程组id。

    c. 组长进程可以创建一个进程组。

    d. 只要进程组还有一个进程存在,则进程组存在,与组长进程是否终止无关。


    1.2 作业(Job)

    a. Shell分前后台来控制的不是进程而是作业或者进程组。

    b. Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制。

    c. 一个前台作业可以由多个进程组成,一个后台也可以由多个进程组成。

    d. 一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在(如果这个子进程还没终止),它自动变为后台进程组


    1.3 会话(Session)

    a. 一个或多个进程组的集合。

    b. 一个会话可以有一个控制终端。

    c. 建立与控制终端连接的会话首进程被称为控制进程。

    d. 一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意后台进程组。


    1.4 作业与进程组的区别:如果作业中的某个进程又创建了子进程,则子进程不属于作业。


  2. 终端

    内核中处理终端设备的模块包括硬件驱动程序和线路规程(Line Discipline)。


    2.1 硬件驱动程序

     硬件驱动程序负责读写实际的硬件设备,比如从键盘读入字符和把字符输出到显示器。


    2.2线路规程像一个过滤器,对于某些特殊字符并不是让它直接通过,而是做特殊处理,比如在键盘上按下Ctrl- Z,对应的字符并不会被用户程序的read读到,而是被线路规程截获,解释成SIGTSTP信号发给前台进程,通常会使该进程停止。线路规程应该过滤哪些字符和做哪些特殊处理是可以配置的。


    2.3终端设备有输入和输出队列缓冲区,如下图所示。

    技术分享

    解析:以输入队列为例,当从键盘输入的字符经过线路规程过滤后,用户已先入先出的顺序读取数据。当输入队列满时再向输入队列输入数据会导致数据丢失,系统也会发出响铃警报。这时,终端可以通过配置回显模式,在这种模式下,终端可以把每个字符给输出队列也可以给用户程序。即,字符不仅可以被程序读取也可以回显在屏幕上。


  3. 终端登录过程

    1、系统启动时,init进程根据配置文件/etc/inittab确定需要打开哪些终端。例如配置文件中有这样一行:1:2345:respawn:/sbin/getty 9600 tty1

    和/etc/passwd类似,

    a. 每个字段用:号隔开。开头的1是这一行配置的id,通常要和tty的后缀一致,配置tty2的那一行id就应该是2。

    b. 第二个字段2345表示运行级别2~5都执行这个配置。

    c. 最后一个字段/sbin/getty 9600 tty1是init进程要fork/exec的命令,打开终端/dev/tty1,波特率是9600(波特率只对串口和Modem终端有意义),然后提示用户输入帐号。中间的respawn字段表示init进程会监视getty进程的运行状态,一旦该进程终止,init会再次fork/exec这个命令,所以我们从终端退出登录后会再次提示输入帐号。

    d. 有些新的Linux发行版已经不用/etc/inittab这个配置文件了,例如Ubuntu用/etc/event.d目录下

    的配置文件来配置init。


    2、getty根据命令行参数打开终端设备作为它的控制终端,把文件描述符0、1、2都指向控制终端,然后提示用户输入帐号。用户输入帐号之后,getty的任务就完成了,它再执行login程序:

    execle("/bin/login", "login", "-p", username, NULL, envp);


    3、login程序提示用户输入密码(输入密码期间关闭终端的回显),然后验证帐号密码的正确性。 如果密码不正确,login进程终止,init会重新fork/exec一个getty进程。如果密码正确,login程序设置一些环境变量,设置当前工作目录为该用户的主目录,然后执行Shell:

    execl("/bin/bash", "-bash", NULL);

    注意argv[0]参数的程序名前面加了一个-,这样bash就知道自己是作为登录Shell启动的,执行登录Shell的启动脚本。从getty开始exec到login,再exec到bash,其实都是同一个进程,因此控制终端没变,文件描述符0、1、2也仍然指向控制终端。由于fork会复制PCB信息,所以由Shell启动的其它进程也都是如此。


  4. 作业控制(Job Control):一个前台作业可以由多个进程组成,一个后台作业也可以由多个进程组成,Shell可以同时运行一个前台作业和任意多个后台作业。

    a. Shell分前后台来控制的不是进程而是作业或者进程组。

    b. 当用户在控制终端输入特殊的控制键(例如Ctrl-C)时,内核会发送相应的信号(例如SIGINT)给前台进程组的所有进程。

     

  5. 守护进程(Daemon)

    5.1 定义

    a. 系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程叫叫守护进程。

    b. 守护进程也称精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。

    c. Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器http等。守护进程完成许多系统任务。比如,作业规划进程crond等。


    5.2

    用psaxj命令查看系统中的进程。

    a. 参数a表示不仅列当前用户的进程,也列出所有其他用户的进程;

    b. 参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程;

    c. 参数j表示列出与作业控制相关的信息。

     

    5.3凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。

本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1771625

终端、作业控制与守护进程

标签:守护   前台   

原文地址:http://10707460.blog.51cto.com/10697460/1771625

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!