Chinaunix首页 | 论坛 | 博客

分类: LINUX

2009-01-18 15:00:23

  什么是程序 (process)

  由前面一连几个章节的资料看来,我们一直强调在 Linux 底下所有的指令与您能够进行的动作都与权限有关, 而系统如何判定你的权限呢?当然就是前面 帐号管理 章节当中提到的 UID/GID 的相关概念,以及档案的属性相关性啰!再进一步来解释, 您现在大概知道,在 Linux 系统当中:‘触发任何一个事件时, 系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系, 给予这个 PID 一组有效的权限设定。’ 从此以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!

  看这个定义似乎没有什么很奇怪的地方,不过,您得要瞭解什么叫做‘触发事件’才行啊! 我们在什么情况下会触发一个事件?而同一个事件可否被触发多次?呵呵!来瞭解瞭解先!

  程序与执行档 (process & program)

  我们如何产生一个 Process ID (PID) 呢?其实很简单啦,就是‘执行一个程式或指令’ 就可以触发一个事件了而取得一个 PID 啰!我们说过,系统应该是仅认识 binary file 的, 那么当我们要让系统工作的时候,当然就是需要启动一个 binary file 啰, 那个 binary file 就是程式 (program) 啦!

  那我们知道,每个程式都有三组人马的权限,每组人马都具有 r/w/x 的权限, 所以:‘不同的使用者身份执行这个 program 时,系统给予的权限也都不相同!’ 举例来说,我们可以利用 touch 来建立一个空的档案,当 root 执行这个 touch 指令时,他取得的是 UID/GID = 0/0 的权限,而当 dmtsai (UID/GID=501/501) 执行这个 touch 时,他的权限就跟 root 不同啦!

  再举个更常见的例子,我们要操作系统的时候,通常是利用连线程式或者直接在主机前面登入, 然后取得我们的 shell 对吧!那么,我们的 shell 是 bash 对吧,这个 bash 在 /bin/bash 对吧, 那么同时间的每个人登入都是执行 /bin/bash 对吧!不过,每个人取得的权限就是不同! 也就是说,我们可以这样看:
  

  图一、程式与程序之间的差异

  也就是说,当我们登入并执行 bash 时,系统已经给我们一个 PID 了, 这个 PID 就是依据登入者的 UID/GID (/etc/passwd) 来的啦~ 以上面的图来做说明的话,我们知道 /bin/bash 是一个程式 (program),当 dmtsai 登入后,他取得一个 PID 号码为 2234 的程序,这个程序的 User/Group 都是 dmtsai, 而当这个程式进行其他作业时,例如上面提到的 touch 这个指令时, 那么由这个程序衍生出来的其他程序在一般状态下,也会沿用这个程序的相关权限的!

  # 子程序与父程序:

  在上面的说明里面,我们有提到所谓的‘衍生出来的程序’,那是个啥咚咚? 这样说好了,当我们登入系统后,会取得一个 bash 的 shell ,然后,我们用这个 bash 提供的介面去执行另一个指令,例如 /usr/bin/passwd 或者是 touch 等等, 那些另外执行的指令也会被触发成为 PID ,呵呵!那个 PID 就是‘子程序’了, 而在我们的 bash 环境下,就称为‘父程序’了!

  另外,是否还记得我们在 bash shell 那一篇里面有提到 ‘环境变数’在不同程序之间的呼叫呢?现在稍微晓得是什么意思了吗? 是啦!因为我们有执行不同的 bash 嘛!既然执行两次,自然就会取得两个 PID, 而因为要让两个 PID 之间具有一些相关性,我们的 bash 就使用了环境变数啰!

(评论:bash是程序,环境变量是bash程序的配置参数。etc/profile、~/bashrc等是bash的配置文件。)

  例题:请在目前的 bash 环境下,再触发一次 bash ,并以‘ ps -l ’这个指令观察程序相关的输出资讯。
  答:

  直接执行 bash ,会进入到子程序的环境中,然后输入 ps -l 后,出现:

  F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
  0 S   500 21337 21336  0  75   0 -  1348 wait   pts/1    00:00:00 bash
  0 S   500 22573 21337  2  75   0 -  1348 wait   pts/1    00:00:00 bash
  0 R   500 22591 22573  0  76   0 -  1302 -      pts/1    00:00:00 ps

  有看到那个 PID 与 PPID 吗?第一个 bash 的 PID 与第二个 bash 的 PPID 都是 21337 啊,因为第二个 bash 是来自于第一个所产生的嘛!


  重点来啦!所以说,在系统上面的各个程序可能是有相关性的喔! 也就是有所谓的父程序与子程序的关系~至于程序的相关性,我们可以使用 pstree 这支程式去查验, 就能知道彼此之间的关系了。

  另外要注意的是:所谓‘擒贼先擒王’, 如果哪天你一直发现‘奇怪,怎么有个程式关闭后,不久又会自动产生? 而且自动产生的 PID 还不一样!’,呵呵!大概不需要怀疑的是,如果不是 例行性命令 的影响, 肯定有一支父程序存在,他会一直重新触发你想要关闭的那个程序, 导致你老是关不了。那怎么办?不是说过擒贼先擒王吗?关闭那支父程序啦! ^_^

  其实子程序与父程序之间的关系还挺复杂的,最大的复杂点在于程式互相之间的呼叫, 以及两者权限的相关性!这个可能就得要您自己多多建立自己的经验了~

  # 系统或网路服务:常驻在记忆体的程序

  如果就我们之前学到的一些指令资料来看,其实我们下达的指令都很简单, 包括用 ls 显示档案啊、用 touch 建立档案啊、rm/mkdir/cp/mv 等指令管理档案啊、 chmod/chown/passwd 等等的指令来管理权限等等的,不过,这些指令都是执行完就结束了。 也就是说,该项指令被触发后所产生的 PID 很快就会终止呢! 那有没有一直在执行的程序啊?当然有啊!而且多的是呢!

  举个简单的例子来说好了,我们知道系统每分钟都会去扫瞄 /etc/crontab 以及相关的设定档, 来进行工作排程吧?那么那个工作排程是谁负责的?当然不是鸟哥啊! 呵呵!是 crond 这个程式所管理的,我们将他启动在背景当中一直持续不断的运作, 套句以前 DOS 年代常常说的一句话,那就是‘常驻在记忆体当中的程序’啦!

  这些常驻在记忆体当中的程序有很多,不过主要大致分成系统本身所需要的服务, 例如刚刚提到的 crond 及 atd ,还有 syslog 等等的。还有一些则是负责网路连线的服务, 例如 Apache, named, postfix, vsftpd... 等等的。这些网路服务比较有趣的地方, 在于这些程式被执行后,他会启动一个可以负责网路监听的埠口 (port) , 以提供外部用户端 (client) 的连线要求。

  这部分我们会在认识系统服务的地方再好好的讲一讲, 在这里,您先有个概念,大概知道一下,系统上面的 PID 几乎都是透过执行一些指令所产生的, 而这些指令可能会负责一些重要的工作,例如网路伺服器啊、系统效能维持啊、 或是其他系统重要工作等等。若有兴趣的话,可以先以 netstat 检查一下您主机上的网路服务喔!

阅读(1525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~