Presentation is loading. Please wait.

Presentation is loading. Please wait.

第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.

Similar presentations


Presentation on theme: "第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口."— Presentation transcript:

1 第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口

2 7.1 联机用户接口 联机用户接口   联机用户接口,也称为联机命令接口。不同操作系统的联机命令接口有所不同,这不仅指命令的种类、数量及功能方面,也可能体现在命令的形式、用法等方面。不同的用法和形式构成了不同的用户界面,可分成以下两种: (1) 字符显示式用户界面; (2) 图形化用户界面。

3   1.命令行方式   该方式是指以行为单位输入和显示不同的命令。每行长度一般不超过256个字符,命令的结束通常以回车符为标记。命令的执行是串行、间断的,后一个命令的输入一般需等到前一个命令执行结束,如用户键入的一条命令处理完成后,系统发出新的命令输入提示符,用户才可以继续输入下一条命令。

4   也有许多操作系统提供了命令的并行执行方式,例如一条命令的执行需要耗费较长时间,并且用户也不急需其结果时(即两条命令执行是不相关的),则可以在一个命令的结尾输入特定的标记,将该命令作为后台命令处理,用户接着即可继续输入下一条命令,系统便可对两条命令进行并行处理。一般而言,对新用户来说,命令行方式十分繁琐,难以记忆,但对有经验的用户而言,命令行方式用起来快捷便当、十分灵活,所以,至今许多操作员仍常使用这种命令方式。 简单命令的一般形式为: Command arg1 arg2 ...argn 其中,Command 是命令名,又称命令动词,其余为该命令所带的执行参数,有些命令可以没有参数。

5   2.批命令方式   在操作命令的实际使用过程中,经常遇到需要对多条命令的连续使用,或若干条命令的重复使用,或对不同命令进行选择性使用的情况。如果用户每次都采用命令行方式,将命令一条条由键盘输入,既浪费时间,又容易出错。因此,操作系统都支持一种称为批命令的特别命令方式,允许用户预先把一系列命令组织在一种称为批命令文件的文件中,一次建立,多次执行。使用这种方式可减少用户输入命令的次数,既节省了时间和减少了出错概率,又方便了用户。通常批命令文件都有特殊的文件扩展名,如MS-DOS系统的 .BAT文件。

6   同时,操作系统还提供了一套控制子命令,增强对命令文件使用的支持。用户可以使用这些子命令和形式参数书写批命令文件,使得这样的批命令文件可以执行不同的命令序列,从而增强了命令接口的处理能力。如UNIX 和Linux 中的Shell不仅是一种交互型命令解释程序,也是一种命令级程序设计语言解释系统,它允许用户使用Shell 简单命令、位置参数和控制流语句编制带形式参数的批命令文件,称做Shell 文件或Shell 过程,Shell 可以自动解释和执行该文件或过程中的命令。

7 7.1.2 联机命令的类型   为了能向用户提供多方面的服务,通常,OS都向用户提供了几十条甚至上百条的联机命令。根据这些命令所完成功能的不同,可把它们分成以下几类: ① 系统访问类;② 磁盘操作类;③ 文件操作类;④ 目录操作类;⑤ 通信类;⑥ 其他命令。现分述如下。

8   1.系统访问类   在单用户微型机中,一般没有设置系统访问命令。然而在多用户系统中,为了保证系统的安全性,都毫无例外地设置了系统访问命令,即注册命令Login。用户在每次开始使用某终端时,都须使用该命令,使系统能识别该用户。凡要在多用户系统的终端上上机的用户,都必须先在系统管理员处获得一合法的注册名和口令。以后,每当用户在接通其所用终端的电源后,便由系统直接调用,并在屏幕上显示出以下的注册命令:

9   Login:     /提示用户键入自己的注册名 当用户键入正确的注册名,并按下回车键后,屏幕上又会出现:   Password:    /提示用户键入自己的口令   用户在键入口令时,系统将关闭掉回送显示,以使口令不在屏幕上显示出来。如果键入的口令正确而使注册成功时,屏幕上会立即出现系统提示符(所用符号随系统而异),表示用户可以开始键入命令。如果用户多次(通常不超过三次)键入的注册名或口令都有错,系统将解除与用户的联接。

10   2.磁盘操作命令   在微机操作系统中,通常都提供了若干条磁盘操作命令。   (1) 磁盘格式化命令Format。它被用于对指定驱动器上的软盘进行格式化。每张新盘在使用前都必须先格式化。其目的是使磁盘记录格式能为操作系统所接受。可见,不同操作系统将磁盘初始化后的格式各异。此外,在格式化过程中,还将对有缺陷的磁道和扇区加保留记号,以防止将它分配给数据文件。

11   (2) 复制整个软盘命令Diskcopy。该命令用于复制整个磁盘,另外它还有附加的格式化功能。如果目标盘片是尚未格式化的,则该命令在执行时,首先将未格式化的软盘格式化,然后再进行复制。
  (3) 软盘比较命令Diskcomp。该命令用于将源盘与目标盘的各磁道及各扇区中的数据逐一进行比较。   (4) 备份命令Backup。该命令用于把硬盘上的文件复制到软盘上,而RESTORE命令则完成相反的操作。

12   3.文件操作命令   每个操作系统都提供了一组文件操作命令。在微机OS中的文件操作命令有下述几种:   (1) 显示文件命令type:用于将指定文件内容显示在屏幕上。   (2) 拷贝文件命令copy:用于实现文件的拷贝。   (3) 文件比较命令comp:用于对两个指定文件进行比较。两文件可以在同一个或不同的驱动器上。   (4) 重新命名命令Rename:用于将以第一参数命名的文件改成用第二参数给定的名字。   (5) 删除文件命令erase:用于删除一个或一组文件,当参数路径名为*.BAK时,表示删除指定目录下的所有其扩展名为 .Bak的文件。

13   4.目录操作命令   (1) 建立子目录命令mkdir:用于建立指定名字的新目录。   (2) 显示目录命令dir:用于显示指定磁盘中的目录项。   (3) 删除子目录命令rmdir:用于删除指定的子目录文件,但不能删除普通文件,而且,一次只能删除一个空目录(其中仅含“.”和“..”两个文件),不能删除根及当前目录。   (4) 显示目录结构命令tree:用于显示指定盘上的所有目录路径及其层次关系。   (5) 改变当前目录命令chdir:用于将当前目录改变为由路径名参数给定的目录。用“..”作参数时,表示应返回到上一级目录下。

14   5.其它命令   (1) 输入输出重定向命令。在有的OS中定义了两个标准I/O设备。通常,命令的输入取自标准输入设备,即键盘;而命令的输出通常是送往标准输出设备,即显示终端。如果在命令中设置输出重定向“>”符,其后接文件名或设备名,表示将命令的输出改向,送到指定文件或设备上。类似地,若在命令中设置输入重定向“<”符,则不再是从键盘而是从重定向符左边参数所指定的文件或设备上,取得输入信息。

15   (2) 管道连接。这是指把第一条命令的输出信息作为第二条命令的输入信息;类似地,又可把第二条命令的输出信息作为第三条命令的输入信息。这样,由两个(含两条)以上的命令可形成一条管道。在MS-DOS和UNIX中,都用“|”作为管道符号,其一般格式为:   Command1 | Command2 | … | Commandn;

16   (3) 过滤命令。在UNIX及MS-DOS中都有过滤命令,用于读取指定文件或标准输入,从中找出由参数指定的模式,然后把所有包含该模式的行都打印出来。例如,MS-DOS中用命令
  find/N“erase”(路径名) 可对由路径名指定的输入文件逐行检索,把含有字符串“erase”的行输出。其中,/N是选择开关,表示输出含有指定字串的行;如果不用N而用C,则表示只输出含有指定字串的行数;若用V,则表示输出不含指定字串的行。

17   (4) 批命令。为了能连续地使用多条键盘命令,或多次反复地执行指定的若干条命令,而又免去每次重敲这些命令的麻烦,可以提供一特定文件。在MS-DOS中提供了一种特殊文件,其后缀名用“.BAT”;在UNIX系统中称为命令文件。它们都是利用一些键盘命令构成一个程序,一次建立供多次使用。在MS-DOS中用batch命令去执行由指定或默认驱动器的工作目录上指定文件中所包含的一些命令。

18 7.1.3 键盘终端处理程序   为了实现人机交互,还须在微机或终端上配置相应的键盘终端处理程序,它应具有下述几方面的功能: (1) 接收用户从终端上打入的字符。 (2) 字符缓冲,用于暂存所接收的字符。 (3) 回送显示。 (4) 屏幕编辑。 (5) 特殊字符处理。

19   1.字符接收功能   为了实现人机交互,键盘终端处理程序必须能够接收从终端输入的字符,并将之传送给用户程序。有两种方式来实现字符接收功能:   (1) 面向字符方式。驱动程序只接收从终端打入的字符,并且不加修改地将它传送给用户程序。这通常是一串未加工的ASCII码。但大多数的用户并不喜欢这种方式。

20   (2) 面向行方式。终端处理程序将所接收的字符暂存在行缓冲中,并可对行内字符进行编辑。仅在收到行结束符后,才将一行正确的信息送命令解释程序。在有的计算机中,从键盘硬件送出的是键的编码(简称键码),而不是ASCII码。例如,当打入a键时,是将键码“30”放入I/O寄存器,此时,终端处理程序必须参照某种表格,将键码转换成ASCII码。应当注意,某些IBM的兼容机使用的不是标准键码。此时,处理程序还须选用相应的表格将其转换成标准键码。

21   2.字符缓冲功能   为了能暂存从终端键入的字符,以降低中断处理器的频率,在终端处理程序中,还必须具有字符缓冲功能。字符缓冲可采用以下两种方式之一:   (1) 专用缓冲区方式。这是指系统为每个终端设置一个缓冲区,暂存用户键入的一批字符,缓冲区的典型长度为200个字符左右。这种方式较适合于单用户微机或终端很少的多用户机。当终端数目较多时,需要的缓冲区数目可能很大,且每个缓冲区的利用率也很低。例如,当有100个终端时,要求有20 KB的缓冲区。但专用缓冲区方式可使终端处理程序简化。图7-1(a)示出了专用缓冲区方式。

22 图7-1 两种缓冲方式

23   (2) 公用缓冲池方式。系统不必为每个终端设置专用缓冲区,只须设置一个由多个缓冲区构成的公用缓冲池。其中的每个缓冲区大小相同,如为20个字符,再将所有的空缓冲区链接成一个空缓冲区链。当终端有数据输入时,可先向空缓冲区链申请一空缓冲区来接收输入字符;当该缓冲区装满后,再申请一空缓冲区。这样,直至全部输入完毕,并利用链接指针将这些装有输入数据的缓冲区链接成一条输入链。每当该输入链中一个缓冲区内的字符被全部传送给用户程序后,便将该缓冲区从输入链中移出,再重新链入空缓冲区链中。显然,利用公用缓冲池方式可有效地提高缓冲的利用率。图7-1(b)示出了公用缓冲池方式。

24   3.回送显示   回送显示(回显)是指每当用户从键盘输入一个字符后,终端处理程序便将该字符送往屏幕显示。有些终端的回显由硬件实现,其速度较快,但往往会引起麻烦。如当用户键入口令时,为防止口令被盗用,显然不该有回显。此外,用硬件实现回显也缺乏灵活性,因而近年来多改用软件来实现回显,这样可以做到在用户需要时才回显。用软件实现回显,还可方便地进行字符变换,如将键盘输入的小写英文字母变成大写,或相反。驱动程序在将输入的字符送往屏幕回显时,应打印在正确的位置上;当光标走到一行的最后一个位置后,便应返回到下一行的开始位置。例如,当所键入的字符数目超过一行的80个(字符)时,应自动地将下一个字符打印到下一行的开始位置。

25   4.屏幕编辑   用户经常希望能对从键盘打入的数据(字符)进行修改,如删除(插入)一个或多个字符。为此,在终端处理程序中,还应能实现屏幕编辑功能,包括能提供若干个编辑键。常用的编辑键有:   (1) 删除字符键。它允许将用户刚键入的字符删除。在有的系统中是利用退格键即Backspace(Ctrl+H)键。当用户敲该键时,处理程序并不将刚键入的字符送入字符队列,而是从字符队列中移出其前的一个字符。

26   (2) 删除一行键。该键用于将刚输入的一行删去。
  (3) 插入键。利用该键在光标处可插入一个字符或一行正文。   (4) 移动光标键。在键盘上有用于对光标进行上、下、左、右移动的键。   (5) 屏幕上卷或下移键,等等。

27   5.特殊字符处理   终端处理程序必须能对若干特殊字符进行及时处理,这些字符是:   (1) 中断字符。当程序在运行中出现异常情况时,用户可通过键入中断字符的办法来中止当前程序的运行。在许多系统中是利用Break或Delete或Ctrl+C键作为中断字符。对中断字符的处理比较复杂。当终端处理程序收到用户键入的中断字符后,将向该终端上的所有进程发送一个要求进程终止的软中断信号,这些进程收到该软中断信号后,便进行自我终止。

28   (2) 停止上卷字符。用户键入此字符后,终端处理程序应使正在上卷的屏幕暂停上卷,以便用户仔细观察屏幕内容。在有的系统中,是利用Ctrl+S键来停止屏幕上卷的。
  (3) 恢复上卷字符。有的系统利用Ctrl+Q键使停止上卷的屏幕恢复上卷。终端处理程序收到该字符后,便恢复屏幕的上卷功能。   上述的Ctrl+S与Ctrl+Q两字符并不被存储,而是被用去设置终端数据结构中的某个标志。每当终端试图输出时,都须先检查该标志。若该标志已被设置,便不再把字符送至屏幕。

29 7.1.4 命令解释程序   1.命令解释程序的作用   在联机操作方式下,终端处理程序把用户键入的信息送键盘缓冲区中保存。一旦用户键入回车符,便立即把控制权交给命令处理程序。显然,对于不同的命令,应有能完成特定功能的命令处理程序与之对应。可见,命令解释程序的主要作用是在屏幕上给出提示符,请用户键入命令,然后读入该命令,识别命令,再转到相应命令处理程序的入口地址,把控制权交给该处理程序去执行,并将处理结果送屏幕上显示。若用户键入的命令有错,而命令解释程序未能予以识别,或在执行中间出现问题时,则应显示出某一出错信息。

30   2.命令解释程序的组成   (1) 常驻部分。这部分包括一些中断服务子程序。例如:正常退出中断INT 20,它用于在用户程序执行完毕后,退回操作系统;驻留退出中断INT 27,用这种方式,退出程序可驻留在内存中;还有用于处理和显示标准错误信息的INT 24等。常驻部分还包括这样的程序: 当用户程序终止后,它检查暂存部分是否已被用户程序覆盖,若已被覆盖,便重新将暂存部分调入内存。

31 (2) 初始化部分。它跟随在常驻内存部分之后,在启动时获得控制权。这部分还包括对AUTOEXEC
  (2) 初始化部分。它跟随在常驻内存部分之后,在启动时获得控制权。这部分还包括对AUTOEXEC.BAT文件的处理程序,并决定应用程序装入的基地址。每当系统接电或重新启动后,由处理程序找到并执行AUTOEXEC.BAT文件。由于该文件在用完后不再被需要,因而它将被第一个由COMMAND.COM装入的文件所覆盖。   (3) 暂存部分。这部分主要是命令解释程序,并包含了所有的内部命令处理程序、批文件处理程序,以及装入和执行外部命令的程序。它们都驻留在内存中,但用户程序可以使用并覆盖这部分内存,在用户程序结束时,常驻程序又会将它们重新从磁盘调入内存,恢复暂存部分。

32   3.命令解释程序的工作流程   系统在接通电源或复位后,初始化部分获得控制权,对整个系统完成初始化工作,并自动执行AUTOEXEC.BAT文件,之后便把控制权交给暂存部分。暂存部分首先读入键盘缓冲区中的命令,判别其文件名、扩展名及驱动器名是否正确。若发现有错,在给出出错信息后返回;若无错,再识别该命令。一种简单的识别命令的方法是基于一张表格,其中的每一表目都是由命令名及其处理程序的入口地址两项所组成的。如果暂存部分在该表中能找到键入的命令,且是内部命令,便可以直接从对应表项中获得该命令处理程序的入口地址,然后把控制权交给该处理程序去执行该命令。如果发现键入的命令不属于内部命令而是外部命令,则暂存部分还须为之建立命令行;再通过执行系统调用exec来装入该命令的处理程序,并得到其基地址;然后把控制权交给该程序去执行相应的命令。图7-2 示出了MS-DOS的COMMAND.COM的工作流程。

33 图7-2 COMMAND.COM的工作流程

34 7.2 Shell命令语言 7.2.1 简单命令   所谓简单命令,实际上是一个能完成某种功能的目标程序的名字。UNIX系统规定的命令由小写字母构成(仅前8个字母有效)。命令可带有参数表,用于给出执行命令时的附加信息。命令名与参数表之间还可使用一种称为选项的自变量,用破折号开始,后跟一个或多个字母、数字。选项是对命令的正常操作加以修改,一条命令可有多个选项,命令的格式如下:   $ Command-option argument list 例如:   $ LS file1 file2 ↙

35   这是一条不带选项的列目录命令,$是系统提示符。该命令用于列出file1和file2两个目录文件中所包含的目录项,并隐含地指出按英文字母顺序列表。若给出-tr选项,该命令可表示成:
  $ LS-tr file1 file 2 ↙ 其中,选项t和r分别表示按最近修改次序及按反字母顺序列表。   通常,命令名与该程序的功能紧密相关,以便于记忆。命令参数可多可少,也可缺省。例如:   $ LS ↙

36   1.进入与退出系统   (1) 进入系统,也称为注册。事先,用户须与系统管理员商定一个唯一的用户名。管理员用该名字在系统文件树上,为用户建立一个子目录树的根结点。当用户打开自己的终端时,屏幕上会出现Login:提示,这时用户便可键入自己的注册名,并用回车符结束。然后,系统又询问用户口令,用户可用回车符或事先约定的口令键入。这两步均须正确通过检查,才能出现系统提示符(随系统而异),以提示用户自己已通过检查,可以使用系统。若任一步骤有错,系统均通过提示要求用户重新键入。

37   (2) 退出系统。每当用户用完系统后,应向系统报告自己不再往系统装入任何处理要求。系统得知后,便马上为用户记账,清除用户的使用环境。若用户使用系统是免费的,退出操作仅仅是一种礼貌。如果用户使用的是多终端中的一个终端,为了退出,用户只需按下Control-D键即可,系统会重新给出提示符即Login,以表明该终端可供另一新用户使用。用户的进入与退出过程,实际上是由系统直接调用Login及Logout程序完成的。

38   2.文件操作命令   (1) 显示文件内容命令cat。如果用户想了解自己在当前目录中的某个或某几个指定文件的内容时,便可使用下述格式的cat命令:   $ cat filename1 filename2 ↙ 执行上述命令后,将按参数指定的顺序,依次把所列名字的文件内容送屏幕显示。若键入文件名有错,或该文件不在当前目录下,则该命令执行结果将显示指定文件不能打开的信息。

39   (2) 复制文件副本的命令cp。其格式为:   cp source target 该命令用于对已存在的文件source建立一个名为target的副本。   (3) 对已有文件改名的命令mv。其格式为   mv oldname newname   用于把原来的老名字改成指定的新名字。   (4) 撤消文件的命令rm。它给出一个参数表,是要撤消的文件名清单。   (5) 确定文件类型的命令file。该命令带有一个参数表,用于给出想了解其(文件)类型的文件名清单。命令执行的结果将在屏幕上显示出各个文件的类型。

40   3.目录操作命令   (1) 建立目录的命令mkdir(简称md)。当用户要创建或保存较多的文件时,应该以自己的注册名作为根结点,建立一棵子目录树,子树中的各结点(除树叶外)都是目录文件。可用md命令来构建一个目录,参数是新创建目录的名字。但应注意该命令的使用,必须在其父目录中有写许可时,才允许为其创建子目录。   (2) 撤消目录的命令rmdir(简称rd)。它实际上是rm命令的一个特例,用于删除一个或多个指定的下级空目录。若目录下仍有文件,该命令将被认为是一个错误操作,这样可以防止因不慎而消除了一个想保留的文件。命令的参数表用于给出要撤消的目录文件清单。

41   (3) 改变工作目录的命令cd。不带参数的cd命令将使用户从任何其它目录回到自己的注册目录上;若用全路径名作参数,cd命令将使用户来到由该路径名确定的结点上;若用当前目录的子目录名作参数,将把用户移到当前目录指定的下一级目录上(即用其下一级目录作为新的当前目录);用“..”号或“*”号将使当前目录上移一级,即移到其父结点上。   (4) 改变对文件的存取方式的命令chmod。其格式为   chmod op-code permission filename

42 其中,用于指明访问者的身份,可以是用户自己、用户组、所有其他用户及全部,分别用u、g、o和a表示;op-code是操作码,分别用 +、- 及 = 表示增加、消除及赋予访问者以某种权利;而permission则是分别用r、 w及x表示读、 写及执行许可。例如,命令   chmod go-w temp 表示消除用户组及所有其他用户对文件temp的写许可。

43   4.系统询问命令   (1) 访问当前日期和时间命令date。例如,用命令    $ date ↙ 屏幕上将给出当前的日期和时间,如为    Wed Ang 14 09:27:20 PDT 1991 表示当前日期是1991年9月14日、 星期三,还有时间信息。若在命令名后给出参数,则date程序把参数作为重置系统时钟的时间。

44   (2) 询问系统当前用户的命令who。who命令可列出当前每一个处在系统中的用户的注册名、终端名和注册进入时间,并按终端标志的字母顺序排序。例如,报告有下列三用户:
  Veronica bxo66 Aug 27 13:28   Rathomas dz24 Aug 28 07:42   Jlyates tty5 Aug 28 07:39

45   用户可用who命令了解系统的当前负荷情况;也可在与其他用户通信之前,用此命令去核实一下当前进入系统的用户及其所使用终端名和所用的正确的注册名。例如,用户在使用系统的过程中,有时会发现在打入一个请求后,系统响应很慢,这时用户可用“who|we-L”命令,使系统打印出当前的用户数目而不显示系统用户名等的完整清单,以得知当前用户数目。

46   (3) 显示当前目录路径名的命令pwd。当前目录的路径名是从根结点开始,通过分支上的所有结点到达当前目录结点为止的路径上的所有结点的名字拼起来构成的。用户的当前目录可能经常在树上移动。如果用户忘记了自己在哪里,便可用pwd确定自己的位置。

47 7.2.2 重定向与管道命令   1.重定向命令   在UNIX系统中,由系统定义了三个文件。其中,有两个分别称为标准输入和标准输出的文件,各对应于终端键盘输入和终端屏幕输出。它们是在用户注册时,由Login程序打开的。这样,在用户程序执行时,隐含的标准输入是键盘输入,标准输出即屏幕(输出)显示。但用户程序中可能不要求从键盘输入,而是从某个指定文件上读取信息供程序使用;同样,用户可能希望把程序执行时所产生的结果数据,写到某个指定文件中而非屏幕上。这就使用户必须去改变输入与输出文件,即不使用标准输入、标准输出,而是把另外的某个指定文件或设备,作为输入或输出文件。

48   Shell向用户提供了这种用于改变输入、 输出设备的手段,此即标准输入与标准输出的重新定向。用重定向符“<”和“>”分别表示输入转向与输出转向。例如,对于命令
  $ cat file1 ↙ 表示将文件file1的内容在标准输出上打印出来。若改变其输出,用命令   $ cat file1>file2 ↙ 时,表示把文件file1的内容打印输出到文件file2上。同理,对于命令   $ wc ↙

49   须指明的是,在做输出转向时,若上述的文件file2并不存在,则先创建它;若已存在,则认为它是空白的,执行上述输出转向命令时,是用命令的输出数据去重写该文件;如果文件file2事先已有内容,则命令执行结果将用文件file1的内容去更新文件file2的原有内容。现在,如果又要求把file4的内容附加到现有的文件file2的末尾,则应使用另一个输出转向符“>>”,即此时应再用命令   $ cat file4>>file2 ↙

50   便可在文件file2中,除了上次复制的file1内容外,后面又附加了file4的内容。
  $ cat file1 file4>>file2 ↙ 此外,也可在一个命令行中,同时改变输入与输出。例如,命令行   a.out<file1>file0 ↙ 表示在可执行文件a.out执行时,将从文件file1中提取数据,而把a.out的执行结果数据输出到文件file0中。

51   2.管道命令   在有了上述的重定向思想后,为了进一步增强功能,人们又进一步把这种思想加以扩充,用符号“|”来连接两条命令,使其前一条命令的输出作为后一条命令的输入。即   $ command 1| command 2 ↙ 例如,对于下述输入   cat file|wc ↙ 将使命令cat把文件file中的数据作为wc命令的计数用输入。

52   从概念上说,系统执行上述输入时,将为管道建立一个作为通信通道的pipe文件。这时,cat命令的输出既不出现在终端(屏幕)上,也不存入某中间文件,而是由UNIX系统来“缓冲”第一条命令的输出,并作为第二条命令的输入。在用管道线所连接的命令之间,实现单向、同步运行。其单向性表现在: 只把管道线前面的命令的输出送入管道,而管道的输出数据仅供管道线后面的命令去读取。管道的同步特性则表现为:当一条管道满时,其前一条命令停止执行;而当管道空时,则其后一条命令停止运行。除此两种情况外,用管道所连接的两条命令“同时”运行。可见,利用管道功能,可以流水线方式实现命令的流水线化,即在单一命令行下,同时运行多条命令,以加速复杂任务的完成。

53 7.2.3 通信命令   1.信箱通信命令mail   mail命令被作为在UNIX的各用户之间进行非交互式通信的工具。mail采用信箱通信方式。发信者把要发送的消息写成信件,“邮寄”到对方的信箱中。通常各用户的私有信箱采用各自的注册名命名,即它是目录/usr/spool/mail中的一个文件,而文件名又是用接收者的注册名来命名的。信箱中的信件可以一直保留到被信箱所有者消除为止。

54   因而,用mail进行通信时,不要求接收者利用终端与发送者会话。亦即,在发信者发送信息时,虽然接收者已在系统中注册过,但允许他此时没有使用系统;也可以是虽在使用系统,但拒绝接收任何信息。mail命令在用于发信时,把接收者的注册名当作参数打入后,便可在新行开始键入信件正文,最后仍在一个新行上用“.”来结束信件或用“^D”退出mail程序(也可带选项,此处从略)。

55   接收者也用mail命令读取信件,可使用可选项r、 q或p等。其命令格式为
  mail [-r][-q][-p][-file][-F persons]   由于信箱中可存放所接收的多个信件,这就存在一个选取信件的问题。上述几个选项分别表示: 按先进先出顺序显示各信件的内容;在输入中断字符(Del或Return)后,退出mail程序而不改变信箱的内容;一次性地显示信箱全部内容而不带询问;把指定文件当作信件来显示。在不使用-p选项时,表示在显示完一个信件后,便出现“?”,以询问用户是否继续显示下一条消息,或选读完最后一条消息后退出mail。

56   2.对话通信命令write   用这条命令可以使用户与当前在系统中的其他用户直接进行联机通信。由于UNIX系统允许一个用户同时在几个终端上注册,故在用此命令前,要用who命令去查看目标用户当前是否联机,或确定接收者所使用的终端名。命令格式为   write user[ttyname] 当接收者只有一个终端时,终端名可缺省。当接收者的终端被允许接收消息时,屏幕提示会通知接收者源用户名及其所用终端名。

57   3.允许或拒绝接收消息命令mesg   mesg命令的格式为:     mesg[-n][-y]   选项n表示拒绝对方的写许可(即拒绝接收消息);选项y指示恢复对方的写许可,仅在此时,双方才可联机通信。当用户正在联机编写一份资料而不愿被别人干扰时,常选用n选项来拒绝对方的写许可。编辑完毕,再用带有y选项的mesg命令来恢复对方的写许可,不带自变量的mesg命令只报告当前状态而不改变它。

58 7.2.4 后台命令   有些命令需要执行很长的时间,这样,当用户键入该命令后,便会发现自己已无事可做,要一直等到该命令执行完毕,方可再键入下一条命令。这时用户自然会想到应该利用这段时间去做些别的事。UNIX系统提供了这种机制,用户可以在这种命令后面再加上“&”号,以告诉Shell将该命令放在后台执行,以便用户在前台继续键入其它命令。

59   在后台运行的程序仍然把终端作为它的标准输出和标准错误文件,除非对它们进行重新定向。其标准输入文件是自动地被从终端定向到一个被称为“/dev/null”的空文件中。若shell未重定向标准输入,则shell和后台进程将会同时从终端进行读入。这时,用户从终端键入的字符可能被发送到一个进程或另一个进程,并不能预测哪个进程将得到该字符。   因此,对所有在后台运行的命令的标准输入,都必须加以重定向,从而使从终端键入的所有字符都被送到Shell进程。用户可使用ps、wait及Kill命令去了解和控制后台进程的运行。

60 7.3 系 统 调 用 7.3.1 系统调用的基本概念   通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序(过程),并将它们提供给应用程序调用。由于这些程序或过程是OS系统本身程序模块中的一部分,为了保护操作系统程序不被用户程序破坏,一般都不允许用户程序访问操作系统的程序和数据,所以也不允许应用程序采用一般的过程调用方式来直接调用这些过程,而是向应用程序提供了一系列的系统调用命令,让应用程序通过系统调用去调用所需的系统过程。

61   1.系统态和用户态   在计算机系统中,通常运行着两类程序:系统程序和应用程序,为了保证系统程序不被应用程序有意或无意地破坏,为计算机设置了两种状态:系统态(也称为管态或核心态)和用户态(也称为目态)。操作系统在系统态运行,而应用程序只能在用户态运行。在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数操作系统将CPU的指令集分为特权指令和非特权指令两类。

62   1) 特权指令   所谓特权指令,就是在系统态时运行的指令,是关系到系统全局的指令。其对内存空间的访问范围基本不受限制,不仅能访问用户存储空间,也能访问系统存储空间,如启动各种外部设备、设置系统时钟时间、关中断、清主存、修改存储器管理寄存器、执行停机指令、转换执行状态等。特权指令只允许操作系统使用,不允许应用程序使用,否则会引起系统混乱。

63   2) 非特权指令   非特权指令是在用户态时运行的指令。一般应用程序所使用的都是非特权指令,它只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,其对内存的访问范围也局限于用户空间。这样,可以防止应用程序的运行异常对系统造成的破坏。   这种限制是由硬件实现的,如果在应用程序中使用了特权指令,就会发出权限出错信号,操作系统捕获到这个信号后,将转入相应的错误处理程序,并将停止该应用程序的运行,重新调度。

64   2.系统调用   如上所述,一方面由于系统提供了保护机制,防止应用程序直接调用操作系统的过程,从而避免了系统的不安全性。但另一方面,应用程序又必须取得操作系统所提供的服务,否则,应用程序几乎无法作任何有价值的事情,甚至无法运行。为此,在操作系统中提供了系统调用,使应用程序可以通过系统调用的方法,间接调用操作系统的相关过程,取得相应的服务。   当应用程序中需要操作系统提供服务时,如请求I/O资源或执行I/O操作,应用程序必须使用系统调用命令。由操作系统捕获到该命令后,便将CPU的状态从用户态转换到系统态,然后执行操作系统中相应的子程序(例程),完成所需的功能。执行完成后,系统又将CPU状态从系统态转换到用户态,再继续执行应用程序。

65   可见,系统调用在本质上是应用程序请求OS内核完成某功能时的一种过程调用,但它是一种特殊的过程调用,它与一般的过程调用有下述几方面的明显差别:
  (1) 运行在不同的系统状态。一般的过程调用,其调用程序和被调用程序都运行在相同的状态——系统态或用户态;而系统调用与一般调用的最大区别就在于:调用程序是运行在用户态,而被调用程序是运行在系统态。

66   (2) 状态的转换通过软中断进入。由于一般的过程调用并不涉及到系统状态的转换,可直接由调用过程转向被调用过程。但在运行系统调用时,由于调用和被调用过程是工作在不同的系统状态,因而不允许由调用过程直接转向被调用过程。通常都是通过软中断机制,先由用户态转换为系统态,经核心分析后,才能转向相应的系统调用处理子程序。   (3) 返回问题。在采用了抢占式(剥夺)调度方式的系统中,在被调用过程执行完后,要对系统中所有要求运行的进程做优先权分析。当调用进程仍具有最高优先级时,才返回到调用进程继续执行;否则,将引起重新调度,以便让优先权最高的进程优先执行。此时,将把调用进程放入就绪队列。

67   (4) 嵌套调用。像一般过程一样,系统调用也可以嵌套进行,即在一个被调用过程的执行期间,还可以利用系统调用命令去调用另一个系统调用。当然,每个系统对嵌套调用的深度都有一定的限制,例如最大深度为6。但一般的过程对嵌套的深度则没有什么限制。图7-3示出了没有嵌套及有嵌套的两种系统调用情况。

68 图7-3 系统功能的调用

69   3.中断机制   系统调用是通过中断机制实现的,并且一个操作系统的所有系统调用都通过同一个中断入口来实现。如MS-DOS提供了INT 21H,应用程序通过该中断获取操作系统的服务。   对于拥有保护机制的操作系统来说,中断机制本身也是受保护的,在IBM PC上,Intel提供了多达255 个中断号,但只有授权给应用程序保护等级的中断号,才是可以被应用程序调用的。对于未被授权的中断号,如果应用程序进行调用,同样会引起保护异常,而导致自己被操作系统停止。如Linux 仅仅给应用程序授权了4 个中断号:3、4、5以及80h,前三个中断号是提供给应用程序调试所使用的,而80h正是系统调用(system call)的中断号。

70 7.3.2 系统调用的类型   1.进程控制类系统调用   这类系统调用主要用于对进程的控制,如创建一个新的进程和终止一个进程的运行,获得和设置进程属性等。   1) 创建和终止进程的系统调用   在多道程序环境下,为使多道程序能并发执行,必须先利用创建进程的系统调用来为欲参加并发执行的各程序分别创建一个进程。当进程已经执行结束时、 或因发生异常情况而不能继续执行时,可利用终止进程的系统调用来结束该进程的运行。

71   2) 获得和设置进程属性的系统调用   当我们创建了一个(些)新进程后,为了能控制它(们)的运行,应当能了解、 确定和重新设置它(们)的属性。这些属性包括: 进程标识符、进程优先级、最大允许执行时间等。此时,我们可利用获得进程属性的系统调用,来了解某进程的属性,利用设置进程属性的系统调用,来确定和重新设置进程的属性。

72   3) 等待某事件出现的系统调用   进程在运行过程中,有时需要等待某事件(条件)出现后方可继续执行。例如,一进程在创建了一个(些)新进程后,需要等待它(们)运行结束后,才能继续执行,此时可利用等待子进程结束的系统调用进行等待;又如,在客户/服务器模式中,若无任何客户向服务器发出消息,则服务器接收进程便无事可做,此时该进程就可利用等待(事件)的系统调用,使自己处于等待状态,一旦有客户发来消息时,接收进程便被唤醒,进行消息接收的处理。

73   2.文件操纵类系统调用   对文件进行操纵的系统调用数量较多,有创建文件、删除文件、打开文件、关闭文件、读文件、写文件、建立目录、移动文件的读/写指针、改变文件的属性等。   1) 创建和删除文件   当用户需要在系统中存放程序或数据时,可利用创建文件的系统调用creat,由系统根据用户提供的文件名和存取方式来创建一个新文件;当用户已不再需要某文件时,可利用删除文件的系统调用unlink将指名文件删除。

74   2) 打开和关闭文件   用户在第一次访问某个文件之前,应先利用打开文件的系统调用open,将指名文件打开,即系统将在用户(程序)与该文件之间建立一条快捷通路。在文件被打开后,系统将给用户返回一个该文件的句柄或描述符;当用户不再访问某文件时,又可利用关闭文件的系统调用close,将此文件关闭,即断开该用户程序与该文件之间的快捷通路。

75   3) 读和写文件   用户可利用读系统调用read,从已打开的文件中读出给定数目的字符,并送至指定的缓冲区中;同样,用户也可利用写系统调用write,从指定的缓冲区中将给定数目的字符写入指定文件中。read和write两个系统调用是文件操纵类系统调用中使用最频繁的。

76   3.进程通信类系统调用   在OS中经常采用两种进程通信方式,即消息传递方式和共享存储区方式。当系统中采用消息传递方式时,在通信前,必须先打开一个连接。为此,应由源进程发出一条打开连接的系统调用open connection,而目标进程则应利用接受连接的系统调用accept connection表示同意进行通信;然后,在源和目标进程之间便可开始通信。可以利用发送消息的系统调用send message或者用接收消息的系统调用receive message来交换信息。通信结束后,还须再利用关闭连接的系统调用close connection结束通信。

77   用户在利用共享存储区进行通信之前,须先利用建立共享存储区的系统调用来建立一个共享存储区,再利用建立连接的系统调用将该共享存储区连接到进程自身的虚地址空间上,然后便可利用读和写共享存储区的系统调用实现相互通信。   除上述的三类外,常用的系统调用还包括设备管理类系统调用和信息维护类系统调用,前者主要用于实现申请设备、释放设备、设备I/O 和重定向、获得和设置设备属性、逻辑上连接和释放设备等功能,后者主要用来获得包括有关系统和文件的时间、日期信息、操作系统版本、当前用户以及有关空闲内存和磁盘空间大小等多方面的信息。

78 POSIX标准   目前许多操作系统都提供了上面所介绍的各种类型的系统调用,实现的功能也相类似,但在实现的细节和形式方面却相差很大,这种差异给实现应用程序与操作系统平台的无关性带来了很大的困难。为解决这一问题,国际标准化组织ISO给出的有关系统调用的国际标准POSIX1003.1(Portable Operating System IX),也称为“基于UNIX 的可移植操作系统接口”。   POSIX 定义了标准应用程序接口(API),用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。只有符合这一标准的应用程序,才有可能完全兼容多种操作系统,即在多种操作系统下都能够运行。

79   POSIX 标准定义了一组过程,这组过程是构造系统调用所必须的。通过调用这些过程所提供的服务,确定了一系列系统调用的功能。一般而言,在POSIX标准中,大多数的系统调用是一个系统调用直接映射一个过程,但也有一个系统调用对应若干个过程的情形,如一个系统调用所需要的过程是其它系统调用的组合或变形时, 则往往会对应多个过程。

80   需要明确的是,POSIX标准所定义的一组过程虽然指定了系统调用的功能,但并没有明确规定系统调用是以什么形式实现的,是库函数还是其它形式。如早期操作系统的系统调用使用汇编语言编写,这时的系统调用可看成是扩展的机器指令,因而,能在汇编语言编程中直接使用。而在一些高级语言或C语言中,尤其是最新推出的一些操作系统,如UNIX新版本、Linux、Windows 和OS/2 等,其系统调用干脆用C语言编写,并以库函数形式提供,所以在用C 语言编制的应用程序中,可直接通过使用对应的库函数来使用系统调用,库函数的目的是隐藏访管指令的细节,使系统调用更像过程调用。但一般地说,库函数属于用户程序而非系统调用程序。如图7-4示出了UNIX/Linux的系统程序、库函数、系统调用的层次关系。

81 图7-4 Unix/Linux系统程序、库函数、系统调用的分层关系

82 系统调用的实现   1.中断和陷入硬件机构   1) 中断和陷入的概念   中断是指CPU对系统发生某事件时的这样一种响应: CPU暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行。图7-5表示中断时CPU的活动轨迹。还可进一步把中断分为外中断和内中断。所谓外中断,是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;而内中断则是指由于CPU内部事件所引起的中断,如程序出错(非法指令、地址越界)、电源故障等。内中断(trap)也被译为“捕获”或“陷入”。通常,陷入是由于执行了现行指令所引起的;而中断则是由于系统中某事件引起的,该事件与现行指令无关。由于系统调用引起的中断属于内中断,因此把由于系统调用引起中断的指令称为陷入指令。

83 图7-5 中断时的CPU轨迹

84   2) 中断和陷入向量   为了处理上的方便,通常都是针对不同的设备编制不同的中断处理程序,并把该程序的入口地址放在某特定的内存单元中。此外,不同的设备也对应着不同的处理机状态字PSW,且把它放在与中断处理程序入口指针相邻接的特定单元中。在进行中断处理时,只要有了这样两个字,便可转入相应设备的中断处理程序,重新装配处理机的状态字和优先级,进行对该设备的处理。因此,我们把这两个字称为中断向量。相应地,把存放这两个字的单元称为中断向量单元。类似地,对于陷入,也有陷入向量,不同的系统调用对应不同的陷入向量,在进行陷入处理时,根据陷入指令中的陷入向量,转入实现相应的系统调用功能的子程序,即陷入处理程序。由所有的中断向量和陷入向量构成了中断和陷入向量表,如图7-6所示。

85 (a) 中断向量 (b) 陷入向量 图7-6 中断向量与陷入向量

86   2.系统调用号和参数的设置   往往在一个系统中设置了许多条系统调用,并赋予每条系统调用一个唯一的系统调用号。在系统调用命令(陷入指令)中把相应的系统调用号传递给中断和陷入机制的方法有很多种,在有的系统中,直接把系统调用号放在系统调用命令(陷入指令)中;如 IBM 370和早期的UNIX系统,是把系统调用命令的低8位用于存放系统调用号;在另一些系统中,则将系统调用号装入某指定寄存器或内存单元中,如MS-DOS是将系统调用号放在AH寄存器中,Linux则是利用EAX寄存器来存放应用程序传递的系统调用号。

87   每一条系统调用都含有若干个参数,在执行系统调用时,如何设置系统调用所需的参数,即如何将这些参数传递给陷入处理机构和系统内部的子程序(过程),常用的实现方式有以下几种:
  (1) 陷入指令自带方式。陷入指令除了携带一个系统调用号外,还要自带几个参数进入系统内部,由于一条陷入指令的长度是有限的,因此自带的只能是少量的、有限的参数。

88   (2) 直接将参数送入相应的寄存器中。MS-DOS便是采用的这种方式,即用MOV指令将各个参数送入相应的寄存器中。系统程序和应用程序显然应是都可以访问这种寄存器的。这种方式的主要问题是由于这种寄存器数量有限,因而限制了所设置参数的数目。   (3) 参数表方式。将系统调用所需的参数放入一张参数表中,再将指向该参数表的指针放在某个指定的寄存器中。当前大多数的OS中,如UNIX系统和Linux系统,便是采用了这种方式。该方式又可进一步分成直接和间接两种方式,如图7-7所示。在直接参数方式中,所有的参数值和参数的个数N,都放入一张参数表中;而在间接参数方式中,则在参数表中仅存放参数个数和指向真正参数数据表的指针。

89 图7-7 系统调用的参数形式

90   3.系统调用的处理步骤   在设置了系统调用号和参数后,便可执行一条系统调用命令。不同的系统可采用不同的执行方式。在UNIX系统中,是执行CHMK命令;而在MS-DOS中则是执行INT 21软中断。   系统调用的处理过程可分成以下三步:首先,将处理机状态由用户态转为系统态;之后,由硬件和内核程序进行系统调用的一般性处理,即首先保护被中断进程的CPU环境,将处理机状态字PSW、程序计数器PC、系统调用号、用户栈指针以及通用寄存器内容等,压入堆栈;然后,将用户定义的参数传送到指定的地址保存起来。

91   其次,是分析系统调用类型,转入相应的系统调用处理子程序。为使不同的系统调用能方便地转向相应的系统调用处理子程序,在系统中配置了一张系统调用入口表。表中的每个表目都对应一条系统调用,其中包含该系统调用自带参数的数目、系统调用处理子程序的入口地址等。因此,核心可利用系统调用号去查找该表,即可找到相应处理子程序的入口地址而转去执行它。   最后,在系统调用处理子程序执行完后,应恢复被中断的或设置新进程的CPU现场,然后返回被中断进程或新进程,继续往下执行。

92   4.系统调用处理子程序的处理过程   系统调用的功能主要是由系统调用子程序来完成的。对于不同的系统调用,其处理程序将执行不同的功能。我们以一条在文件操纵中常用的Creat命令为例来说明之。

93   进入Creat的处理子程序后,核心将根据用户给定的文件路径名Path,利用目录检索过程去查找指定文件的目录项。查找目录的方式可以用顺序查找法,也可用Hash查找法。如果在文件目录中找到了指定文件的目录项,表示用户要利用一个已有文件来建立一个新文件。但如果在该已有(存)文件的属性中有不允许写属性,或者创建者不具有对该文件进行修改的权限,便认为是出错而做出错处理;若不存在访问权限问题,便将已存文件的数据盘块释放掉,准备写入新的数据文件。如未找到指名文件,则表示要创建一个新文件,核心便从其目录文件中找出一个空目录项,并初始化该目录项,包括填写文件名、文件属性、文件建立日期等,然后将新建文件打开。

94 7.4 UNIX系统调用 7.4.1 UNIX系统调用的类型 1.进程控制
  1.进程控制   该类系统调用包括:创建进程的系统调用fork、终止进程的系统调用exit、等待子进程结束的系统调用wait等十多条。   (1) 创建进程(fork)。一个进程可以利用fork系统调用来创建一个新进程。新进程是作为调用者的子进程,它继承了其父进程的环境、 已打开的所有文件、根目录和当前目录等,即它继承了父进程几乎所有的属性,并具有与其父进程基本上相同的进程映像。

95   (2) 终止进程(exit)。一个进程可以利用exit实现自我终止。通常,在父进程创建子进程时,便在子进程的末尾安排一条exit系统调用。这样,子进程在完成规定的任务后,便可进行自我终止。子进程终止后,留下一记账信息status,其中包含了子进程运行时记录下来的各种统计信息。   (3) 等待子进程结束(wait)。wait用于将调用者进程自身挂起,直至它的某一子进程终止为止。这样,父进程可以利用wait使自身的执行与子进程的终止同步。

96   (4) 执行一个文件(exec)。 exec可使调用者进程的进程映像(包括用户程序和数据等)被一个可执行的文件覆盖,此即改变调用者进程的进程映像。该系统调用是UNIX系统中最复杂的系统调用之一。
  (5) 获得进程ID。UNIX系统提供了一组用于获得进程标识符的系统调用,比如,可利用getp-id系统调用来获得调用进程的标识符,利用getpgrp系统调用来获得调用进程的进程组ID,以及利用getppid系统调用来获得调用进程的父进程ID等。

97   (6) 获得用户ID。UNIX系统提供了一组用于获得用户ID的系统调用,如getuid可用于获得真正的用户ID,geteuid用于获得有效用户ID,getgid用于获得真正用户组ID等。
  (7) 进程暂停(pause)。可用此系统调用将调用进程挂起,直至它收到一个信号为止。

98   2.文件操纵   (1) 创建文件(creat)。系统调用creat的功能是根据用户提供的文件名和许可权方式,来创建一个新文件或重写一个已存文件。如果系统中不存在指名文件,核心便以给定的文件名和许可权方式来创建一个新文件;如果系统中已有同名文件,核心便释放其已有的数据块。创建后的文件随即被打开,并返回其文件描述符fd。若creat执行失败,便返回“-1”。

99   (2) 打开文件(open)。设置系统调用open的目的,是为了方便用户及简化系统的处理。open的功能是把有关的文件属性从磁盘拷贝到内存中,以及在用户和指名文件之间建立一条快捷的通路,并给用户返回一个文件描述符fd。文件被打开后,用户对文件的任何操作都只须使用fd而非路径名。

100   (3) 关闭文件(close)。当把一个文件用毕且暂不访问时,可调用close将文件关闭,即断开用户程序与该文件之间已经建立的快捷通路。在UNIX系统中,由于允许一个文件被多个进程所共享,故只有在无其他任何进程需要此文件时,或者说,在对其索引结点中的访问计数i-count执行减1操作后其值为0,表示已无进程再访问该文件时,才能真正关闭该文件。   (4) 读和写文件read和write。仅当用户利用open打开指定文件后,方可调用read或write对文件执行读或写操作。两个系统调用都要求用户提供三个输入参数: ① 文件描述符fd。

101   ② buf缓冲区首址。对读而言,这是用户所要求的信息传送的目标地址;对写而言,这则是信息传送的源地址。③ 用户要求传送的字节数n byte。
  系统调用read的功能是试图从fd所指示的文件中去读入n byte个字节的数据,并将它们送至由指针buf所指示的缓冲区中;系统调用write的功能是试图把n byte个字节数据,从指针buf所指示的缓冲区中写到由fd所指向的文件中。

102   (5) 连接和去连接(link和unlink)。为了实现文件共享,必须记住所有共享该文件的用户数目。为此,在该文件的索引结点中设置了一个连接计数i.link。每当有一用户要共享某文件时,须利用系统调用link来建立该用户(进程)与此文件之间的连接,并对i.link做加1操作。当用户不再使用此文件时,应利用系统调用unlink去断开此连接,亦即做i.link的减1操作。当i.link减1后结果为0时,表示已无用户需要此文件,此时才能将该文件从文件系统中删除。故在UNIX系统中并无一条删除文件的系统调用。

103   3.进程间的通信   为了实现进程间的通信,在UNIX系统中提供了一个用于进程间通信的软件包,简称IPC。它由消息机制、共享存储器机制和信号量机制三部分组成。在每一种通信机制中,都提供了相应的系统调用供用户程序进行进程间的同步与通信之用。   (1) 消息机制。用户(进程)在利用消息机制进行通信时,必须先利用msgget系统调用来建立一个消息队列。若成功,便返回消息队列描述符msgid,以后用户便可利用msgid去访问该消息队列。用户(进程)可利用发送消息的系统调用msgsend向用户指定的消息队列发送消息;利用msgrcv系统调用从指定的消息队列中接收指定类型的消息。

104   (2) 共享存储器机制。当用户(进程)要利用共享存储器机制进行通信时,必须先利用shmget系统调用来建立一个共享存储区,若成功,便返回该共享存储区描述符shmid。以后,用户便可利用shmid去访问该共享存储区。进程在建立了共享存储区之后,还必须再利用shmat将该共享存储区连接到本进程的虚地址空间上。以后,在进程之间便可利用该共享存储区进行通信。当进程不再需要该共享存储区时,可利用shmdt系统调用来拆除进程与共享存储区间的连接。   (3) 信号量机制。在UNIX系统中所采用的信号量机制,与第二章中所介绍的一般信号量集机制相似,允许将一组信号量形成一个信号量集,并对这组信号量施以原子操作,详见第十章。

105   4.信息维护   在UNIX系统中,设置了许多条用于系统维护的系统调用。   (1) 设置和获得时间。超级用户可利用设置时间的系统调用(stime),来设置系统的日期和时间。如果调用进程并非超级用户,则stime失败。一般用户可利用获得时间的系统调用time来获得当前的日期和时间。   (2) 获得进程和子进程时间(times)。利用该系统调用可获得进程及其子进程所使用的CPU时间,其中包括调用进程在用户空间执行指令所花费的时间,系统为调用进程所花费的CPU时间、子进程在用户空间所用的CPU时间、系统为各子进程所花费的CPU时间等,并可将这些时间填写到一个指定的缓冲区。

106   (3) 设置文件访问和修改时间(utime)。该系统调用用于设置指名文件被访问和修改的时间。如果该系统调用的参数times为NULL时,文件主和对该文件具有写权限的用户,可将对该文件的访问和修改时间设置为当前时间;如果times不为NULL,则把times解释为指向utim buf结构的指针,此时,文件主和超级用户能将访问时间和修改时间置入utim buf结构中。   (4) 获得当前UNIX系统的名称(uname)。利用该系统调用可将有关UNIX系统的信息存储在utsname结构中。 这些信息包括UNIX系统名称的字符串、系统在网络中的名称、 硬件的标准名称等。  

107 7.4.2 被中断进程的环境保护   1.CPU环境保护   当用户程序处在用户态,且在执行系统调用命令(即CHMK命令)之前,应在用户空间提供系统调用所需的参数表,并将该参数表的地址送入R0寄存器。在执行CHMK命令后,处理机将由用户态转为核心态,并由硬件自动地将处理机状态长字(PSL)、程序计数器(PC)和代码操作数(code)压入用户核心栈,继而从中断和陷入向量表中取出trap.S的入口地址,然后便转入中断和陷入总控程序trap.S中执行。

108   trap.S程序执行后,继续将陷入类型type和用户栈指针usp压入用户核心栈,接着还要将被中断进程的CPU环境中的一系列寄存器如R0~R11的部分或全部内容压入栈中。至于哪些寄存器的内容要压入栈中,这取决于特定寄存器中的屏蔽码,该屏蔽码的每一位都与R0~R11中的一个寄存器相对应。当某一位置成1时,表示对应寄存器的内容应压入栈中。

109   2.AP和FP指针   为了实现系统调用的嵌套使用,在系统中还设置了两个指针,其一是系统调用参数表指针AP,用于指示正在执行的系统调用所需参数表的地址,通常是把该地址放在某个寄存器中,例如放在R12中;再者,还须设置一个调用栈帧指针。所谓调用栈帧(或简称栈帧),是指每个系统调用需要保存而被压入用户核心栈的所有数据项;而栈帧指针FP,则是用于指示本次系统调用所保存的数据项。每当出现新的系统调用时,还须将AP和FP压入栈中。图7-8示出了在trap.S总控程序执行后,用户核心栈的情况。   当trap.S完成被中断进程的CPU环境和AP及FP指针的保存后,将会调用由C语言书写的公共处理程序trap.C,以继续处理本次的系统调用所要完成的公共处理部分。

110 图7-8 用户核心栈

111 7.4.3 系统调用陷入后需处理的公共问题   1.确定系统调用号   由上所述得知,在中断和陷入发生后,是先经硬件陷入机构予以处理,再进入trap.S,然后再调用trap.C继续处理。其调用形式为:   trap(usp,type,code,PC,PSL)

112 其中,参数PSL为陷入时处理机状态字长,PC为程序计数器,code为代码操作数,type为陷入类型号,usp为用户栈指针。对陷入的处理可分为多种情况,如果陷入是由于系统调用所引起的,则对此陷入的第一步处理,便是确定系统调用号。通常,系统调用号是包含在代码操作数中,故可利用code来确定系统调用号i。其方法是令    i=code & 0377 若0<I<64,此i便是系统调用号,可根据系统调用号i和系统调用定义表,转向相应的处理子程序。若i=0,则表示系统调用号并未包含在代码操作数中,此时应采用间接参数方式,利用间接参数指针来找到系统调用号。

113   2.参数传送   这是对因系统调用引起的陷入的第二步处理。参数传送是指由trap.C程序将系统调用参数表中的内容,从用户区传送到User结构的U.U-arg中,供系统调用处理程序使用。由于用户程序在执行系统调用命令之前,已将参数表的首址放入R0寄存器中,在进入trap.C程序后,该程序便将该首址赋予U.U-arg指针,因此,trap.C在处理参数传送时,可读取该指针的内容,以获得用户所提供的参数表,并将之送至U.U-arg中。应当注意,对于不同的系统调用,所需传送参数的个数并不相同,trap.C程序应根据在系统调用定义表中所规定的参数个数来进行传送,最多允许10个参数。

114   3.利用系统调用定义表转入相应的处理程序   在UNIX系统中,对于不同(编号)的系统调用,都设置了与之相应的处理子程序。为使不同的系统调用能方便地转入其相应的处理子程序,也将各处理子程序的入口地址放入了系统调用定义表即Sysent[]中。该表实际上是一个结构数组,在每个结构中包含三个元素,其中第一个元素是相应系统调用所需参数的个数;第二个元素是系统调用经寄存器传送的参数个数;第三个元素是相应系统调用处理子程序的入口地址。在系统中设置了该表之后,便可根据系统调用号i从系统调用定义表中找出相应的表目,再按照表目中的入口地址转入相应的处理子程序,由该程序去完成相应系统调用的特定功能。在该子程序执行完后,仍返回到中断和陷入总控程序中的trap.C程序中,去完成返回到断点前的公共处理部分。

115   4.系统调用返回前的公共处理   在UNIX系统中,进程调度的主要依据是进程的动态优先级。随着进程执行时间的加长,其优先级将逐步降低。每当执行了系统调用命令、并由系统调用处理子程序返回到trap.C后,都将重新计算该进程的优先级;另外,在系统调用执行过程中,若发生了错误使进程无法继续运行时,系统会设置再调度标志。处理子程序在计算了进程的优先级后,便去检查该再调度标志是否已又被设置。若已设置,便调用switch调度程序,再去从所有的就绪进程中选择优先级最高的进程,把处理机让给该进程去运行。

116   UNIX系统规定,当进程的运行是处于系统态时,即使再有其他进程又发来了信号,也不予理睬;仅当进程已从系统态返回到用户态时,内核才检查该进程是否已收到了由其他进程发来的信号。若有信号,便立即按该信号的规定执行相应的动作。在从信号处理程序返回后,还将执行一条返回指令RET,该指令将把已被压入用户核心栈中的所有数据(如PSL、PC、FP及AP等)都退还到相应的寄存器中,这样,控制就将从系统调用返回到被中断进程,后者继续执行下去。

117 7.5 图形用户接口 图形化用户界面   图形化用户界面(GUI)是近年来最为流行的联机用户接口形式,并已制定了国际GUI 标准。20世纪90年代推出的主流操作系统都提供了GUI。1981年,Xerox 公司在Star 8010工作站操作系统中,首次推出了图形用户接口。1983年,Apple公司又在Apple Lisa 机和Macintosh 机上的操作系统中成功使用了GUI。之后,还有Microsoft 公司的Windows,IBM 公司的OS/2,UNIX 和Linux 使用的X-Window都使用了GUI。

118   GUI采用了图形化的操作界面,使用WIMP 技术,将窗口(Window)、图标(Icon)、菜单(Menu)、鼠标(Pointing device)和面向对象技术等集成在一起,引入形象的各种图符将系统的各项功能、各种应用程序和文件,直观、逼真地表示出来,形成一个图文并茂的视窗操作环境。用户可以轻松地通过选择窗口、菜单、对话框和滚动条完成对他们作业和文件的各种控制与操作。

119 以Microsoft公司的Windows系列操作系统为例,在系统初始化后,操作系统为终端用户生成了一个运行explorer
  以Microsoft公司的Windows系列操作系统为例,在系统初始化后,操作系统为终端用户生成了一个运行explorer.exe的进程,它运行一个具有窗口界面的命令解释程序,该窗口为一个特殊的窗口,即桌面。在“开始”菜单中罗列了系统的各种应用程序,点击某个程序,则解释程序会产生一个新进程,由新进程弹出一个新窗口,并运行该应用程序,该新窗口的菜单栏或图符栏会显示应用程序的子命令。用户可进一步选择并点击子命令,如果该子命令需要用户输入参数,则会弹出一个对话窗口,指导用户进行命令参数的输入,完成后用户点击“确定”按钮,命令即进入执行处理过程。

120   在Windows系统中,采用的是事件驱动控制方式,用户通过动作来产生事件以驱动程序工作。事件实质就是发送给应用程序的一个消息,用户按键或点击鼠标等动作都会产生一个事件,通过中断系统引出事件驱动控制程序工作,对事件进行接收、分析、处理和清除。各种命令和系统中所有的资源,如文件、目录、打印机、磁盘、各种系统应用程序等都可以定义为一个菜单、一个按钮或一个图标,所有的程序都拥有窗口界面,窗口中所使用的滚动条、按钮、编辑框、对话框等各种操作对象都采用统一的图形显示方式和操作方法。用户可以通过鼠标(或键盘)点击操作选择所需要的菜单、图标或按钮,从而达到控制系统、运行某个程序、执行某个操作(命令)的目的。

121 7.5.2 桌面、图标和任务栏   1.桌面与图标的初步概念   在运行Windows时,其操作都是在桌面进行的。所谓桌面,是指整个屏幕空间,即在运行Windows时用户所看到的屏幕。该桌面是由多个任务共享的。为了避免混淆,每个任务都通过各自的窗口显示其操作和运行情况,因此,Windows允许在桌面上同时出现多个窗口。所谓窗口,是指屏幕上的一块矩形区域。应用程序(包括文档)可通过窗口向用户展示出系统所能提供的各种服务及其需要用户输入的信息;用户可通过窗口中的图标去查看和操纵应用程序或文档。

122   在面向字符的窗口中,并不提供图标。在面向图形的窗口中,图标也是作为图形用户接口中的一个重要元素。所谓图标,是代表一个对象的小图像,如代表一个文件夹或程序的图标,它是最小化的窗口。当用户暂时不用某窗口时,可利用鼠标去点击最小化按钮,即可将该窗口缩小为图标;而通过对该图标双击的操作,又可将之恢复为窗口。   

123   2.桌面上常见的图标   随着计算机设置的不同,在启动Windows时,在桌面左边也会出现一些不同的图标。在Windows中文版的桌面上(见图7-9)比较常见的图标有以下几个:   (1) “我的电脑”。双击此图标后,桌面上将出现“我的电脑”窗口,并在窗口中会显现出用户计算机的所有资源。   (2) “回收站”。该图标用于暂存用户所删除的文件及文件夹,以便在需要时将之恢复。

124 图7-9 桌面与图标

125   (3) “我的文档”。该图标用于供用户存放自己建立的文件夹和文件。
  (4) “Internet Explorer”(简称为IE)。这是Microsoft公司开发的WWW浏览器。在用户电脑与Internet服务提供商ISP连接成功后,便可通过双击IE图标,实现对Internet中网页信息的浏览。   (5) “Outlook Express”。这是Microsoft公司推出的电子邮件应用软件。在用户电脑与ISP连接成功后,可再双击Outlook Express图标,以进一步连接ISP的电子邮件服务器。连接成功后,便可发送电子邮件和接收电子邮件。

126   (6) “网上邻居”。如果用户的电脑已连接到局域网上,那么用户便可通过该图标方便地使用局域网中其它计算机上可共享的资源。
  (7) 收件箱。该软件用于发送或接收远程电子邮件和传真。   (8) “我的公文包”。在用户携带便携机出差期间,无论是便携机中的文件,还是办公室计算机中的文件,都可能发生变化,用户在返回单位后,应尽快使两者保持一致(称之为“同步”)。“我的公文包”软件便是用于保持两者(便携式电脑和台式电脑中的文件)同步的软件。

127   3.“开始”按钮和任务栏   在Windows桌面的下方,一般都设置了“开始”按钮和任务栏,并作为系统的默认设置。只要Windows在运行,在屏幕下方即可见到它。   (1) “开始”按钮。“开始”按钮位于任务栏的左边。当用鼠标的左键单击“开始”按钮时,便可打开一个开始菜单,其中包括了用户常用的工具软件和应用程序,如程序选项、 文档选项、设置选项等。因此,用户会经常使用“开始”按钮来运行一个程序。如果用右键单击“开始”按钮,将打开一个快捷菜单,其中包括“资源管理器”选项。此外,在关闭机器之前,应先关闭Windows,此时同样是单(左)击“开始”按钮,然后再单击菜单中的“关闭系统”选项。

128   (2) 任务栏。设置任务栏的目的是帮助用户快速启动常用的程序,方便地切换当前的程序。因此,在任务栏中包含若干个常用的应用程序小图标,如用于实现英文输入或汉字拼音输入等的小图标、控制音量大小的小图标、查看和改变系统时钟的小图标等。   为了便于任务之间的切换,凡曾经运行过且尚未关闭的任务,在任务栏中都有其相应的小图标。因此,如果用户希望运行其中的某个程序,只需单击代表该程序的小图标,该程序的窗口便可显现在屏幕上。应用程序之间的切换就像看电视时的频道切换一样简单。

129   (3) 任务栏的隐藏方式。任务栏在桌面中所占的大小可根据用户需要进行调整。任务栏可以始终完整地显现在屏幕上,不论窗口是如何切换或移动,都不能把任务栏覆盖掉。当然,这样一来任务栏将占用一定的可用屏幕空间。如果用户希望尽可能拓宽屏幕的可用空间,也可选用任务栏的隐藏方式,这时,任务栏并未真正被消除,只是暂时在屏幕上看不见,相应地,在屏幕底部会留下一条白线,当用户又想操作任务栏时,只需将鼠标移到此白线上,任务栏又会立即显现出来,当鼠标离开该线后,任务栏又会隐藏起来。

130   (4) 任务子栏。在Windows的任务栏中,可以增加若干个任务子栏。例如,增加“地址子栏”后,可在其中存放许多地址,如文件夹名、 局域网上某计算机的地址、 WWW地址等;又如“桌面”子栏,用于显示当前桌面上的组件(“我的电脑”、“我的公文包”等)。任务子栏可以不同的形式放在桌面上,如可利用鼠标将某子栏从桌面上拖出,形成一个独立的窗口,也可将某子栏拖至桌面的边缘,系统会自动地将它变为一个独立的工具栏。

131 7.5.3 窗口   1.窗口的组成   在熟练使用Windows之前,必须先了解其窗口的组成,即了解组成窗口的各元素。图7-10 示出了Windows XP的一个典型窗口,在该窗口中包括如下诸元素:   (1) 标题栏和窗口标题。标题栏是位于窗口顶行的横条,其中含有窗口标题,即窗口名称,如“我的电脑”、“我的文档”、“控制面板”等。   

132 图7-10 “我的电脑”窗口的组成

133   (2) 菜单栏。通常,菜单栏都在窗口标题栏的下面,以菜单条的形式出现。在菜单条中列出了可选的各菜单项,用于提供各类不同的操作功能,比如在“我的电脑”窗口的菜单条中,有文件(F)、编辑(E)、查看(V)等菜单项。   (3) 工具栏。工具栏位于菜单栏的下方。其内容是各类可选工具,或说它由许多命令按钮组成,每一个按钮代表一种工具。例如,我们可利用删除命令按钮来删除一个文件或文件夹;可利用属性命令按钮来查看文件(夹)的属性,包括文件(夹)的类型、大小,在文件夹中包含多少文件和文件的大小等。

134   (4) 控制菜单按钮。它位于窗口标题的左端。可用它打开窗口的控制菜单,在菜单中有用于实现窗口最大化、最小化、关闭等操作的选项按钮。
  (5) 最大化、 最小化和关闭按钮。在窗口标题栏的右边有三个按钮,单击其中间的最大化按钮,可把窗口放大到最大(占据整个桌面);当窗口已经最大化时,最大化按钮就变成还原按钮,单击之,又可将窗口还原为原来的大小;单击左边的最小化按钮,可将窗口缩小成图标;如需关闭该窗口,可单击关闭按钮。

135   (6) 滚动条。当窗口的大小不足以显示出整个文件(档)的内容时,可使用位于窗口底部或右边的滚动块(向右或向下移动),以观察该文件(档)中的其余部分。
  (7) 窗口边框。界定窗口周边的网条边被称为窗口边框。用鼠标移动一条边框的位置可改变窗口的大小;也可利用鼠标去移动窗口的一个角,来同时改变窗口两个边框的位置,以改变窗口的位置和大小。   (8) 工作区域。窗口内部的区域称为工作区域。   

136   2.窗口的性质   1) 窗口的状态   当用户双击图标A而打开相应的窗口A时,该窗口便处于激活状态。此时用户可以看见窗口A中的所有元素,且窗口的标题条呈高亮度蓝色。被激活窗口的应用程序在前台运行,它能接收用户键入的信息。如果用户再双击图标B而打开窗口B时,窗口B又处于激活状态。此时窗口A则转为非激活状态,且窗口A被窗口B所覆盖。我们把窗口虽然已被打开,但却是处于非激活状态的称为打开状态。在Windows的桌面上,允许同时有多个处于打开状态的窗口,但其中只能有一个窗口处于激活状态,亦即,仅有一个应用程序在前台运行,其余的程序都在后台运行。

137   2) 窗口的改变   用户可用鼠标来改变窗口的大小及其在桌面上的位置。因此,既可用鼠标来拖拽窗口边框或窗口角,以改变窗口的大小,又可利用最大化和最小化按钮或控制菜单,来将窗口最大化或最小化。

138 7.5.4 对话框   1.对话框的用途   对话框是在桌面上带有标题条、输入框和按钮的一个临时窗口,也称为对话窗口。虽然对话框与窗口有些相似,但也有明显差别,主要表现为: 在所有对话框上都没有工具栏,而且对话框的大小是固定不变的,因而也没有其相应的最大化和最小化按钮;对话框也不能像窗口那样用鼠标拖拽其边框或窗口角来改变其大小和位置;此外,对话框是临时窗口,用完后便自动消失,或用取消命令将它消除。

139   对话框的主要用途是实现人—机对话,即系统可通过对话框提示用户输入与任务有关的信息,比如提示用户输入要打开文件的名字、其所在目录、所在驱动器及文件类型等信息;或者供用户对对象的属性、窗口等的环境进行重新设置,比如设置文件的属性、设置显示器的颜色和分辨率、设置桌面的显示效果;还可以提供用户可能需要的信息等。   

140   2.对话框的组成   Windows的对话框可由以下几个元素组成,其中有的简单,有的复杂。图7-11(a)、(b)分别示出了Windows XP的“另存为”和“格式化”两个常用的对话框。

141 (a) “另存为”对话框 图 7 -11 对话框

142 (b) “格式化”对话框 图 7 -11 对话框

143   1) 标题栏   如同窗口一样,对话框的标题栏也是位于其顶部,其中,左边部分为对话框名称(如名称为“显示属性”),右边部分是关闭按钮和帮助按钮。

144   2) 输入框   输入框可分为两类: 一类是文本框,是一个供用户输入文本信息的矩形框,用户可通过键盘向文本框内输入任何符合要求的字符串。见图7-11(a)中的文件名文本框。   另一类是列表框。在列表框中为用户提供参考信息供用户选择,但用户不能对列表框中的内容进行修改。列表框有三种形式:第一种是简单列表框,需要显示的内容全部列于该框中;第二种是滚动式列表框,在框的右边框处有一滚动条(滑块),可用来查看该框中未显示部分的内容;第三种是下拉式列表框,在框中仅有一行文字(一个选项),其右边有一个朝下的三角形符号,对它单击后,可弹出一个下拉式列表供用户选择。图7-11(a)中的是“保存类型”的下拉式列表框。

145   3) 按钮   在Windows中,提供了多种形式的按钮,如命令按钮、选择按钮、滑动式按钮、数字式增减按钮等。   (1) 命令按钮。可用该按钮来启动一个立即响应的动作,如“确定”按钮、“取消”按钮、“关闭”按钮、“开始”按钮等。命令按钮通常是含有文字的矩形按钮,在对话框的底部或右部。

146   (2) 选择按钮。它又可分为单选按钮和复选按钮两种。前者是指在同一组的多个单选按钮中,每次必须且只能选择其一。单选按钮为圆形。当某一选项被选中时,该圆形按钮中会增加一个同心圆点,见图7-11(b)中的“格式化类型”下面的三个单选按钮。复选按钮是指用户可根据需要在多个复选按钮中选择其中一个或多个按钮。复选按钮呈方框形,如被选中,相应方框中会出现“√”标记,见图7-11(b)中“其他选项”下面的几个复选按钮。

147   (3) 滑块式按钮。某些对象的属性是可在一定范围内进行连续调节的,比如鼠标被双击的速度、键盘的重复速率、音响音量的调节等。
  (4) 数字式增减按钮。有些属性已被数字化,且可在一定范围内调节。如在“日期/时间”属性中,便有一对用于改变时间的数字式增减按钮。在上述两种按钮上,都有三角形箭头标记,对箭头向上的标记单击时,可使数字增加,单击箭头朝下的标记时,可使数字减小。


Download ppt "第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口."

Similar presentations


Ads by Google