大家好,欢迎来到IT知识分享网。
文章目录
第二章 用户接口
用户接口是用户与计算机系统交互的环境和方式。为了方便用户使用计算机系统,操作系统向用户提供了直接使用计算机系统的手段,通常称为用户接口。用户通过操作系统提供的接口与计算机系统交互,即用户通过一定的方式和途径,将自己的要求告诉计算机,而计算机根据用户不同的要求完成相应的操作和处理。
通常操作系统为用户提供两类接口。一类是系统为用户提供的各种命令控制界面接口,用户利用这些操作命令来组织和控制程序的执行或管理计算机系统。另一类接口是程序接口,编程人员在程序中通过程序接口来请求操作系统提供服务。
本章主要讨论操作系统为用户提供的命令控制界面接口和程序接口。
2.1 命令控制界面接口
在当今几乎所有的操作系统中,都向用户提供了各种联机的命令控制接口界面。用户通过输入设备(键盘、鼠标、触摸屏、声音等)发出一系列命令交互地组织和控制程序的执行或管理计算机系统。
2.1.1联机命令的类型
2.1.2 联机命令接口
目前,大多数操作系统提供了两种联机命令的操作方式,包括了键入式方式和选择式方式,它们针对不同的屏幕显示环境,方便用户的选择和使用。
1.键入式交互命令
键入式交互命令通常指来自控制台和终端键入的操作命令,它是一种命令行操作方式(文本行方式),操作者以字符串形式键入命令,并等待该命令的响应和执行。在单任务环境下,每次只能键入一条命令,只有当该命令功能完成后,操作者才能键入第二条命令。如果操作系统提供多命令缓冲支持,以及在多任务环境和分布式环境下的多命令支持,操作者可以连续键入若干条命令,不必等待每条指令的执行。对于键入式命令,操作者必须记住其命令名、字符串形式及其命令行参数,并须将其在键盘上一一敲入,这是键入式命令的缺点。
这种命令行操作方式是一种简捷的命令语言,适合于有经验的用户,大多数操作系统都具有这样的命令语言。例如,著名的Linux中的命令就是一种文本行式命令语言,它对于熟悉它的用户真可为得心应手。
在当今几乎所有的计算机操作系统中,都向用户提供了键入式交互命令。用户需要操作系统提供服务时,先在终端的键盘上打入所需的命令,由终端处理程序接收该命令,将用户键入的字符放入缓冲,同时提供字符编辑并显示在终端屏幕上,以便用户查看。当一条命令输入完成后,命令解释程序对命令进行分析,然后执行相应的处理程序。
在所有的操作系统中,都把命令解释程序放在操作系统的最高层,以便能直接与用户交互。命令解释程序通常按两种方法解释执行输入的命令。一种方法是由命令解释程序查找命令表而得到该命令的处理程序入口地址,然后由解释程序调用相应子程序而直接执行。这一般是那些最常用的、而且子程序比较短小的命令,即我们常用的内部命令。另一种方法是为输入的命令建立一个子进程,由子进程执行对应的命令。这一般是文本编辑、程序编译以及运行各种实用程序和用户程序等命令,即命令程序较长,用到时才从外存调入内存的外部命令。
2.选择式命令
选择式命令是在用户界面向可视化发展过程中引入的一种命令选择和执行方式。选择式命令不需要用户输入命令名,操作者只需根据不同的输入和选择设备选择所需的命令名,系统根据选择点击信号进入命令的解释执行,任务完成后再返回原操作环境。
在视窗环境推出后,选择式命令的方式得到了广泛的应用。视窗环境是一种面向屏幕的命令交互接口,它的主体是菜单系统,所有的系统命令、操作信息以及各种控制功能操作都出现在命令菜单中,由用户根据需要从系统提供的命令中挑选一种。这对新入门的用户非常有用,因为他们不须记住命令的名,在某些特定的应用中,如文本编辑、程序编写时最为方便。然而,菜单系统会限制用户使用命令的数量,因显示菜单而占用额外的存储空间和时间。
视窗型命令界面是当今操作系统所具有的良好的用户交互界面,是系统可视化的一个基础,所以在操作系统领域被很快推广。例如,无论是Windows系列,还是UNⅨ系列的操作系统,它们的命令控制界面都是由多窗口的按钮式图形界面组成。在这些系统中,命令已被开发成一条条能用点击方式而执行的简单的菜单或小巧的图标。而且,用户也可以在提示符的提示下用普通字符方式输入各种命令。最近,用声音控制的命令控制界面也已逐步被开发出来。可以预计,计算机系统的命令控制界面将会越来越方便和越来越人性化。
2.2 Linux系统的命令控制界面
Linux系统具有丰富的操作命令,这些命令都通过Shell提供给用户使用。Shell是Linux系统为用户提供的键盘命令和解释程序的集合。Linux通过Shell提供了300个以上的命令,由于篇幅所限,本节将介绍Linux系统的常用命令,以使读者对Linux系统命令有一个初步的了解。
2.2.1 登录Shell
2.2.2 命令句法
为了使用户的要求能被Linux系统理解,每条命令必须以正确的格式表示,或者说必须遵循命令行句法。否则,Linux系统将不能理解用户的请求。Linux系统命令以小写字母构成,注意,Linux系统区分大小写字符(这一点与Windows不同)。Linux系统的命令句法如下:
command [option] [arguments]
其中:command是用户要求系统执行的命令名称;
option是选择项,用于改变命令的执行方式,一条命令可以有多个选项。
arguments是命令的操作对象,它规定了命令所操作的数据。
例:命令 ls -l file
要求系统以详细列表方式显示文件file的目录。其中,ls是命令名称,-l是选择项,file是对象。
2.2.3 常用的基本命令
1.显示当前工作目录命令pwd
Linux系统大多数命令的缺省值都是表示在当前目录下对文件进行操作。用户时常需要知道自己在文件系统中所处的位置。命令pwd用于显示用户当前所在的目录。例:
> $pwd > /home/student/txt
显示出你当前所在的工作目录。pwd以绝对路径名(以“/”开头的路径名)的形式显示当前工作目录。
2.列目录命令 ls
ls 的意义为 “list”,也就是将某一个目录内容显示出来。
如果在 ls 命令后面没有跟任何的参数,它将会显示出当前目录中所包含的文件名,而不指出是文件还是目录。
也可以在 ls 后面加上所要察看的文件名称,例:
> $ ls /home/txt > 将显示绝对路径/home/txt下包含的内容。 > $ ls pro1 > 将显示当前工作目录下的子目录pro1中包含的内容。 > $ ls *.jan > 将显示当前工作目录下所有扩展名为jan的文件。
在Linux系统中提供了三种文件名的通配符:,?和[…]。‘’可以和任意字符串相匹配,‘?’和文件名中单个字符匹配,‘[…]’匹配集合内的任意字符。因此,在指定文件名时可以使用通配符来简化输入。
ls 有一些特别的参数,可以给出除文件名外的有关文件的其它信息。常用的参数如下:
-a : 在 Linux 中若一个目录或文件的名字的第一个为 “.” ,则表示文件是隐含的,列目录时,这些文件一般不显示出来。使用ls -a 可显示这类文件。
-F : 该选项可显示出文件名后跟上适当的符号以指明文件的类型。可执行文件后跟一个‘*’表示;目录文件后跟一个‘/’表示;链接文件后跟一个‘@’表示,例:
> $ls –F > letters/ memo@ test* notes
> $ls -l > drwx--x--x 2 student group1 325 Nov 29 05:08 letters >lrwx--x--x 2 student group1 288 Aug 8 22:00 memos > -rw------- 1 student group1 566 Aug 10 06:28 test > -rw------- 1 student group1 266 Feb 12 05:28 notes
> $ls –aF > . .. .mailc* letters/
$cp f1 f2 将文件名为 f1 的文件复制为文件名为 f2 的文件。 $cp –i f1 f2 如果在当前目录下已有一个名为f2的文件,重写文件f2时提示是否重写文件。 $cp f1 f2 f3 dir 将文件 f1、 f2、 f3 以相同的文件名复制一份放到目录 dir 里面。 $cp -r dir1 dir2 将目录 dir1 的全部内容全部复制到目录 dir2 里面。
4.移动文件和更改文件名命令 mv
mv 的意义为 move , 主要是将一文件改名或换至另一个目录。mv 的用法如下:
$mv f1 f2 将文件名为 f1 的文件变更成文件名为 f2 的文件。 $mv dir1 dir2 将文件名为 dir1的目录变更成文件名为 dir2 的目录。 $mv f1 f2 f3 dir 将文件 f1 、f2 、f3 都移至目录 dir 里面。
> $ rm f1 f2 f3 将文件f1、f2 、f3同时删除掉。
而 rm 的参数比较常用的有几个: -f , -i
-f : 将会使得系统在删除时,不提出任何警告讯息。 -i : 在除去文件之前均会询问是否真要删除。
6.建立目录命令mkdir
mkdir 是一个让使用者建立一个目录的指令。你可以在一个目录底下使用 midir 建立一个子目录,使用的方法如下:
mkdir dirname1 [ dirname2 ... ]
7.改变当前工作目录命令 cd
这是让使用者用来转移工作目录用的。cd的用法如下:
cd dirname
例:$cat hello Hello! This is a test!
more 可以将所要查看的文件内容一页页的显示出来,可根据使用者的要求换页或卷。more 的使用方法如下:
chmod [who] op-code permission filename
其中,[who]用于指明访问者的身份,可以是用户自己、用户组、所有其他用户及全部,分别用u、g、o和a表示;op—code是操作码,分别用+、-及=表示增加、消除及赋予访问者以某种权利;而permission则是分别用r、w及x表示读、写及执行许可。例:
$chmod go—w temp
man titil
显示titil 命令的使用方法。
例:man man 显示man命令如何使用的说明。
2.2.4 重定向与管道命令
1.重定向命令
在Linux系统中,由系统定义了两个分别称为标准输入和标准输出的文件,各对应于终端键盘输入和终端屏幕输出。它们是在用户注册时,由Login程序打开的。这样,在用户程序执行时,隐含的标准输入是键盘输入,标准输出即屏幕显示。但用户程序中可能不要求从键盘输入,而是从某个指定文件上读取信息供程序使用;同样,用户可能希望把程序执行时所产生的结果数据,写到某个指定文件中而非屏幕上。这就使用户必须去改变输入与输出文件,即不使用标准输入、标准输出,而是把另外的某个指定文件或设备,作为输入或输出文件。
Shell向用户提供了这种用于改变输入、输出设备的手段,此即标准输入与标准输出的重新定向。用重定向符“<”和“>”分别表示输入转向与输出转向。
例: $cat filel 表示将文件filel的内容,在标准输出上显示出来。 $cat filel>file2 表示把文件filel的内容,输出到文件file2。
须指明的是,在做输出转向时,若上述的文件file2并不存在,则先创建它;若已存在,则认为它是空白的,执行上述输出转向命令时,是用命令的输出数据去重写该文件;如果文件file2事先已有内容,则命令执行结果将用文件filel的内容去更新文件file2的原有内容。现在,如果又要求把file4的内容附加到现有的文件file2的末尾,则应使用另一个输出转向符“》”。例:
$cat file4>>file2
a.out<filel>file0/
$command1|command 2
例:对于下述输入 $cat file|WC 将使命令cat把文件file中的数据,作为WC命令的计数输入。
从概念上说,系统执行上述输入时,将建立一个作为通信通道的pipe文件。这时,cat命令的输出既不出现在终端(屏幕)上,也不存入某中间文件,而是由Linux系统来“缓冲”第一条命令的输出,并作为第二条命令的输入。在用管道线所连接的命令之间,实现单向、同步运行。
其单向性表现在:只把管道线前面的命令的输出送入管道,而管道的输出数据仅供管道线后面的命令去读取。
管道的同步特性则表现为:当一条管道满时,其前一条命令停止执行;而当管道空时,则其后一条命令停止运行。
除此两种情况外,用管道所连接的两条命令“同时”运行。可见,利用管道功能,可以流水线方式实现命令的流水线化,即在单一命令行下,同时运行多条命令,以加速复杂任务的完成。
2.2.5 通信命令
为实现源进程与目标进程(或用户)之间的通信,一种办法是系统为每一进程(或用户)设置一个信箱,源用户把信件投入到目标用户的信箱中去;目标用户则可在此后的任一时间,从自己的信箱中读取信件。在这种通信方式中,源和目标用户之间进行的是非交互式通信,因而也是非实时通信。但在有些办公自动化系统中,经常要求在两用户之间进行交互式会话,即源与目标用户双方必须同时联机操作。在源用户发出信息后,要求目标用户能立即收到信息并给予回答。
Linux系统为用户提供了实时和非实时两种通信方式,分别用write及mail命令。此外,联机用户还可根据自己的当前情况,决定是否接受其他用户与他进行通信的要求。
1.信箱通信命令mail
它被作为在Linux的各用户之间,进行非交互式通信的工具。mail采用信箱通信方式。发信者把要发送的消息写成信件,“邮寄”到对方的信箱中。通常各用户的私有信箱采用各自的注册名命名,即它是目录/usr/spool/mail中的一个文件,而文件名又是用接收者的注册名来命名的。信箱中的信件可以一直保留到被信箱所有者消除为止。因而,用mail进行通信时,不要求接收者利用终端与发送者会话。亦即,在发信者发送信息时,虽然接收者已在系统中注册过,但允许他此时没有使用系统;也可以是虽在使用系统,但拒绝接收任何信息。
mail命令在用于发信时,把接收者的注册名当作参数打入后,便可在新行开始键入信件正文,最后在一个新行上,用“.”来结束信件或用“^D”退出mail程序(也可带选项,此处从略)。
接收者也用mail命令读取信件,可使用可选项r、q或p等。其命令格式为:
$mail [-r][-q][-p][-file][-F persons]
$write user[ttyname]
$mesg [-n][ -y]
选项n表示拒绝对方的写许可(即拒绝接收消息);选项y指示恢复对方的写许可,仅在此时,双方才可联机通信。当用户正在联机编写一份资料而不愿被别人干扰时,常选用n选项来拒绝对方的写许可。编辑完毕,再用带有y选项的mesg命令来恢复对方的写许可,不带称选顶的mesg命令只报告当前状态而不改变它。
2.2.6 后台命令
2.3 程序接口
程序接口旨在运行程序与系统资源及系统服务之间实现交互作用,而为了保证系统的安全性,系统提供了若干系统调用(system call)来实现用户程序和内核的交互。因此,系统调用是操作系统提供给编程人员的唯一接口。编程人员利用系统调用,在源程序一级动态请求和释放系统资源,调用系统中已有的系统功能来完成那些与机器硬件部分相关的工作以及控制程序的执行速度等。事实上,命令控制界面也是在系统调用的基础上开发而成的。
2.3.1 系统调用
通常,在操作系统的核心中都设置了一组用于实现各种系统功能的子程序(过程),用户可以在程序中直接或间接地使用这些子程序,采用低级语言编程可以直接使用这些子程序,采用高级语言编程则采用程序调用的方式,通过解释或编译程序将其翻译成有关的系统调用,完成各种功能和服务。
系统调用是用户程序进入内核程序的唯一途径。因此,它与一般的过程调用有下述几方面的明显差别:
(1)运行在不同的系统状态。一般的过程调用,其调用程序和被调用程序都运行在相同的状态——系统态或用户态;而系统调用与一般调用的最大区别就在于:调用过程是运行在用户态,而被调用程序是运行在系统态。
(2)通过软中断进入。由于一般的过程调用并不涉及到系统状态的转换,故可直接由调用过程转向被调用过程。但在运行系统调用时,由于调用和被调用过程是工作在不同的系统状态,因而不允许由调用过程直接转向被调用过程。通常都是通过软中断机制,先由用户态转换为系统态,经核心分析后,才能转向相应的系统调用处理子程序。
(3)返回问题。在采用了抢占式(剥夺)调度方式的系统中,在被调用过程执行完后,要对系统中所有要求运行的进程做优先权分析。当调用进程仍具有最高优先级时,才返回到调用进程继续执行;否则,将引起重新调度,以便让位优先权最高的进程优先执行。此时,将把调用进程放入就绪队列。
(4)嵌套调用。像一般过程一样,系统调用也可以嵌套进行,即在一个被调用过程的执行期间,还可以利用系统调用命令去调用另一个系统调用。但是,每个系统对嵌套调用的深度都有一定的限制,例如最大深度为6。
系统调用的主要目的是使得用户可以使用操作系统提供的有关设备管理、输入输出系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。
2.3.2 系统调用的类型
2.3.3 系统调用的实现
2.3.4 Linux系统调用
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define MAX_PATH 255 int main() {
char name[MAX_PATH+1]; if(getcwd(name,MAX_PATH)==NUll) printf("error:Failure getting pathname"); printf("Current Directory:%S\n",name); }
程序的运行结果:Current Directory:/home/student
但有点不足是,如果 glibc 没有封装某个内核提供的系统调用时,我就没办法通过上面的方法来调用该系统调用。如我自己通过编译内核增加了一个系统调用,这时 glibc 不可能有你新增系统调用的封装 API,此时我们可以利用 glibc 提供的syscall 函数直接调用。该函数定义在 unistd.h 头文件中,函数原型如下:
long int syscall (long int sysno, ...)
2.3.5 Windows应用编程接口
include "stdafx.h" include "windows.h" define DIRNAME_LEN MAX_PATH+2 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
TCHAR PwdBuffer[DIRNAME_LEN]; DWORD LenCuDir; LenCuDir=GetCurrentDirectory(DIRNAME_LEN,PwdBuffer); if(LenCuDir==0) MessageBox(NULL,"Failure getting pathname,",NULL,MB_OK); MessageBox(NULL,PwdBuffer,"Current Directory",MB_OK); return 0; }
由此可见,Windows API也是一个基于C语言的接口,只是调用函数和编程模式与Linux不同。Windows API中的函数也可以被使用不同语言编写的程序调用,只要在调用时遵循调用规范即可。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140420.html