免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 886 | 回复: 0
打印 上一主题 下一主题

什么是程序 (process)--程序与执行档 (process & program) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-18 15:00 |只看该作者 |倒序浏览
  什么是程序 (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 ,并以‘ 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 检查一下您主机上的网路服务喔!
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68904/showart_1802669.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP