1、2019/7/7,1,第7章 UNIX系统,2019/7/7,2,7.1 UNIX操作系统概述,UNIX操作系统是一个当今世界上十分流行、应用十分广泛的操作系统。在小型计算机和微型计算机领域中相当流行。 UNIX操作系统是一个通用的、交互式的分时系统。 它是由美国贝尔(Bell)实验室的D.itchie和K.Thompson于1969年首先在PDP-7上实现的。该系统吸取了当时许多操作系统的成功经验,如美国麻省理工学院(MIT)研制的CTSS和Multics等系统的优点。,2019/7/7,3, UNIX操作系统的第一个版本是在PDP-7计算机上用汇编语言编写的。1972年才用C语言改写而成,
2、改写后的UNIX系统提高了兼容性和可读性(易读性)。UNIX首先是在大学中流行起来的,到目前,已经过了多次修改,产生过很多版本(现在已产生了第七版)。但它的根本思想没有什么变化,只是在功能上进行了一些有意义的扩充。 尽管UNIX的版本很多,并且也有很大变化,但它们都具有UNIX系统的特点: (1)具有可装卸的分层的树形结构文件系统。该系统具有完整的文件保护的功能,提高了设备的独立性,使用户程序设计更加简单、方便。 (2)UNIX系统是一个可供多个用户同时操作的会话式分时操作系统。不同的用户可以在不同的终端上,同时通过会话方式与系统交互而感觉不到有人在同时使用同一系统。,2019/7/7,4,(
3、3)把所有外部设备看作文件并分别赋以对应的文件名,用户使用设备就像使用文件那样简单,而不必了解设备的内部特性。这就使得对文件和对设备的操作统一起来,方便用户使用。 (4)UNIX系统主要用C语言编写,因此使系统具有易读、易懂、易修改和易移植等一系列优点。 (5)提供了功能完备、使用灵活的命令语言Shell。它既是一种交互式命令解释程序,也是一种命令级程序设计语言解释程序。即在UNIX中,Shell具有双重功能,用户可通过命令在终端上与操作系统对话,直接控制自己程序的运行,也可像高级程序设计语言一样,编制出功能强大,而又十分简洁明了的命令程序。,2019/7/7,5,总的看来,UNIX操作系统的
4、设计目标是: (1)简单性:UNIX并不要求达到某些大型通用操作系统所希望达到的“无所不包、无所不能”的功能,它提供给用户一些基本的必须的功能。因此,UNIX系统比较简单,使用方便,同时功能也非常强大。 (2)通用性:它力求用一种方法,同一机构来服务于几个不同的目的。例如对文件、设备和进程间的消息缓冲区的读和写操作都是同样的系统调用,同样的程序模块。又如同样的命名,别名和存取保护机构都适用于数据文件、目录文件和设备。再如处理机陷阱(TRAP)和软中断使用的也是同样的机构等。 (3)程序开发的方便性:它创建了一个十分方便于程序开发的环境,使得一个新开发的大任务可由许多已有的小程序合成,而不必都重
5、新设计。,2019/7/7,6,7.2 系统结构,整个UNIX系统可分成两大部分:用户层和UNIX操作系统(也称为UNIX的内核)。UNIX系统的内核结构如图7-1所示。 UNIX内核按功能可划分为: 1存储管理; 2进程管理; 3进程通信; 4中断、陷阱与系统调用; 5输入输出管理; 6文件系统。,2019/7/7,7,7- 1 UNIX的内核结构,2019/7/7,8,在UNIX核心之外运行的是用户态的程序,这包括用户程序、大量的应用程序和各种程序包子系统,它们在SHELL命令解释程序管理之下,作为进程的用户态的一部分来运行。所有用户进程(或者说进程的用户态)只能通过SHELL语言在终端上
6、或后台得到服务。,2019/7/7,9,7.3 文件系统,7.3.1 UNIX文件系统概述 7.3.2 文件目录结构和文件(路径)名 7.3.3 与文件有关的系统调用,2019/7/7,10,7.3.1 UNIX文件系统概述, UNIX系统中把文件看成是由一串字符组成的无结构的信息的有序集合。由用户为每个文件指定一个文件名进行标识,用户可为保护自己文件的数据而进行访问权限的设置。文件大小按字符数计算,通常,一个文件最大不能超过百万字节。文件常被存储在大容量磁盘或磁带上。 UNIX文件系统将文件分成三类:,2019/7/7,11,UNIX文件系统概述,1、普通文件: 即通常的正文文件,是无结构、
7、无记录概念的字符流序列。 文件系统以512个字节为一块,文件在块内连续存放。在文件的组织形式上无明显的索引文件、连续文件,链接(串连)文件之分。在文件的访问方式上也无顺序和随机访问之别。 用户可通过系统调用seek原语预先确定下次文件读写的开始位置。 用户也可按自己需要来结构自己的文件,只是文件系统不承认也不了解这种结构。,2019/7/7,12,2、目录文件: UNIX也把目录本身看成是文件。目录文件就是指作为文件内容的数据是一些目录项。这种文件在形式上同普通文件一样,由系统将其解释成目录。 在UNIX系统中,文件名与文件说明是分开的,后者形成一个称为索引节点的数据结构,简称为i节点。一个目
8、录文件包含有多个目录项,每个目录项的格式如图7-2所示。目录项的长度为16个字节,文件名最多不超过14个字符,另外两个字节用作该文件的i 节点指针称为i节点的索引号inode。这样一个512字节的物理盘块可以存放32个目录项。,UNIX文件系统概述,2019/7/7,13,图 7-2目录项格式,一个i节点包含该文件的更多的信息,主要有: (1)文件主标识。拥有该文件的用户标识符; (2)文件主的同组用户标识; (3)文件的存取权限。UNIX把用户分成三类:文件所有者、文件所有者的同组用户和其他一般用户。各类用户在读、写和执行等方面具有不同的存取权限。 (4)存放文件的物理地址。通过直接或间接地
9、址,给出文件数据占用的磁盘块号;,2019/7/7,14,(5)文件长度。即指明文件大小的字节数; (6)文件存取时间。指出文件的建立时间、最近被使用的时间和最近被修改的时间; (7)与该文件进行连接的进程数目; (8)文件的类型。有正规文件、目录文件、字符特别文件、块特别文件及管道文件。一个物理设备上的所有文件的i节点放在一起形成i节点表,i节点表放在该文件卷的i节点表区中。但i节点表本身不被视为文件,而是数据结构。,2019/7/7,15,3、特别文件: UNIX把I/O设备看成是一个特别文件,与普通的文件一样处理,因此,对设备文件的读、写操作实际上是对设备的操作,而对设备文件的保护也就是
10、对设备的保护。这样就使得文件与设备的I/O操作统一起来了。,2019/7/7,16,7.3.2 文件目录结构和文件(路径)名, UNIX的文件系统是一个多层次的树形结构。树的根是一个目录文件,称为根目录,它是整个目录结构的基础。从根目录往下的各级节点,都是目录文件,而树叶则是普通文件或特殊文件。在UNIX文件系统中,每个文件有两个名字:用户起的文件外部名(在目录项中给出),另外还有唯一的内部名。 该内部名由三部分组成:主设备号,次级设备号和i节点号。 在UNIX树形目录结构中,指定一个文件需要将到达该文件所经过的所有目录按顺序组织到一起,最后再加上该文件名组成路径名来说明。,2019/7/7,
11、17,根目录用“/”表示,各级目录及文 件名也用“/”隔开。为了方便和加速对文件的访问,在UNIX系统中,专门开辟了一块内存区作为整个系统的打开文件表,最多可登记100个表目。 UNIX在内存还专门设置了一个活动i节点表,该表登记所有已被打开的文件的i节点内容,以免每次访问文件时都要从文件卷(盘)上的i节点表中去查找该i节点。 每个用户也都有一个打开文件表,最多能登记15个表项,它存在于每个进程的PCB结构中。每一表项登记了一个系统打开文件表中的一个入口指针。用户打开文件表项通过系统打开文件表项连接到活动i节点,而不是直接与i节点连接,这是为了便于文件共享和存取控制。,2019/7/7,18,
12、7.3.3 与文件有关的系统调用, UNIX文件系统为用户提供了如下的几种操作方式: 1文件的建立 格式:fd=creat(name,mode)该调用的主要功能是根据用户提供的文件名及文件属性建立一个文件并打开。如果系统中有同名的文件,则系统将释放原文件占用的存储空间,重新建立文件。 2文件的打开文件必须打开后才能使用,打开文件的过程就是把文件名转换成内部名并进行存取控制检查。 格式:fd=open(name,flag) flag是打开类型(读或写)。 注意:一个文件在用完之后必须关闭,2019/7/7,19,3文件的读和写操作 当文件被打开后,就可以执行读或写的操作了。 格式:fn=read
13、(fd,buf,n) fd是内部文件名,buf为用户要求信息传送到的缓冲区地址,n为读出的字符数,单位是字节。写操作原语write与读原语类似。 UNIX提供流式文件,用户每次可以连续读写若干字符,用读写指针记录当前位置,下次可以接着由指针处进行读或写的操作。,2019/7/7,20,4文件的连接与断开 为了实现文件共享,UNIX提供了一个系统调用原语link: 格式:link(oldname,newname) link的主要功能就是将一个已建立的文件连接到另一个新文件名上。 当用户不再需要某文件时,可以调用unlink原语断开与该文件的连接。 格式:unlink(name) 利用这一系统调用
14、可以解除与指定文件的连接,并清除指定文件的目录项。,2019/7/7,21,7.4 进程管理,7.4.1 进程和进程控制块PCB 7.4.2 进程控制,2019/7/7,22,7.4.1 进程和进程控制块PCB,1、UNIX系统中进程的概念在UNIX系统中,进程具有如下特定的含义和特点: (1)一个进程是对一个程序的执行。 (2)一个进程的存在意味着系统中存在着一个相应的常驻内存的proc结构,其中包含着该进程的控制信息。 (3)对每一个进程,有一个被称为user结构的数据结构,这个结构中存放该进程的私用控制信息。该结构只有该进程运行时,才会调入内存。 (4)一个进程可以创建或撤消其子进程。
15、(5)进程是系统进行资源分配的基本单位。,2019/7/7,23,2、进程的结构UNIX系统中,进程包含三部分内容:进程控制块、程序段以及数据段。下面我们分别对这三部分来进行讨论。 (1)进程控制块PCB在UNIX系统中,整个系统的活动是以进程为基本单位来组织进行的。为了管理进程的活动,系统为每个进程设立了一个进程控制块(PCB)来记录各个进程的状态以及与进程相关的数据。在UNIX系统中,进程控制块也是进程是否存在的标志。因为进程控制块中包含的信息量很大,所以占用的空间也很大。为了节省进程控制块所占的内存空间,UNIX系统把每个进程的进程控制块分为两部分:,2019/7/7,24,(a)常驻内
16、存部分,称proc结构,该结构中包含着进程调度时必须使用的一些主要信息; (b)非常驻内存部分,称user结构,该结构登记了 进程运行时才要用到的更多的信息,它可以随用户的程序和数据在内存中换进换出。UNIX系统将所有进程的proc结构组织到一起,形成一个进程表,也称为proc数组,表中的每一个proc结构是该数组的一个元素,成为该进程表的一个表目。进程表中的proc结构数量是有限制的,在UNIX系统中最多允许有50个。,2019/7/7,25, UNIX系统的proc结构主要包括以下各项: (a)进程标识符(PID)。它是标识一个进程的标识数; (b)用户标识符(UID)。标识拥有该进程的用
17、户; (c)进程状态。记录该进程的当前状态; (d)事件描述符。记录使进程进入睡眠状态的事件; (e)存储区位置和长度。指出进程在内存或在外存中的位置及大小。这些信息在进程换进换出以及状态转换时用到; (f)软中断信号。记录其他进程发来的软中断信号; (g)计时域。给出进程的执行时间和对资源的利用情况; (h)进程的大小。进程的大小是内核为进程分配存储空间的依据; (i)调度参数,包括优先数等。核心用它们决定进程转换到核心态和用户态的次序以及占有处理机的次序。,2019/7/7,26, user结构主要包括以下各项: (a)指向proc结构的指针。标识出对应于该user结构的proc结构; (
18、b)真正用户标识符(real user ID)。它是超级用户分配给用户的标识符,以后每次用户登录进入系统时,均需送入此标识符; (c)有效用户标识符(effective user ID)。一般情况下,它与真正用户标识符相同,但在其它用户允许的情况下,可用系统调用setuid将它改变为其它用户标识符,以获得对该用户的文件进行操作的权力; (d)用户文件描述符表。记录了该进程已打开的所有文件;,2019/7/7,27,(e)当前目录和当前根。给出进程的文件系统环境; (f)计时器。记录进程及其子进程在用户态和核心态运行的时间; (g)内部I/O参数。给出要传输的数据量、源数据或目标数据的地址、文件
19、的输入、输出偏移量; (h)限制值。对进程的大小及其能“写”的文件大小的限制; (i)系统调用信息。记录当前系统调用的参数、结果、返回值以及错误码等。,2019/7/7,28,(2)数据段分为三部分:进程数据区(PPDA)、用户的程序和数据区、用户栈区。其中,底部为进程数据区,共1024个字节。 进程数据区又分为两部分:最底部的289个字节是进程控制块的一部分USER结构,它含有进程的更多的信息;另一部分是该进程的系统栈,自顶向下扩展。进程数据区是属于进程的核心空间的一部分,因此进程的用户程序部分不能访问这一部分,只有该进程的系统程序部分才能访问进程数据部分。 数据段的顶部是用户栈区,物理上是
20、从顶向下扩展。 数据段的中间部分是可读写的用户的程序和数据区。,2019/7/7,29,图 7-3 进程数据段结构,2019/7/7,30,(3)正文段 正文段包括该进程所执行的所有可共享的、可再入的纯代码和常数。一个进程的正文段也可以不存在。 UNIX系统为了方便管理,将系统中所有这些只读的可共享的正文段组织在一个正文表中,在内存中的所有正文段均在这个正文表中有一个对应表目。该表目中包含有该正文段在内存和磁盘上的地址,该段大小和使用此段的进程数目等信息。该正文表又叫TEXT数组。 UNIX系统中最多允许在内存中同时存放40个正文段,也就是说TEXT数组的元素最多为40个。 整个系统中的进程控
21、制如图7-4所示。,2019/7/7,31,图 7-4 进程的组成,2019/7/7,32,在UNIX系统中,每个进程都包括两部分:系统程序部分和用户程序部分。 当进程在用户模式下运行时,执行的是用户程序。此时若发生中断或陷阱,则转入核心模式,执行系统核心程序。 值得注意的是,UNIX系统核心的所有程序都是作为进程的一部分来运行,它们被包括在每个进程的虚地址空间中。有时,我们把进程的用户程序部分叫做用户进程,而把核心程序部分叫做系统进程。在UNIX系统的一个进程中,无论是用户进程还是系统进程,都是进程的一部分,它们拥有同一个进程控制块,只不过这两个进程所执行的程序不同,映射的物理地址空间不同,
22、使用的堆栈不同而已。,2019/7/7,33,7.4.2 进程控制, UNIX系统中进程控制子系统主要负责进程同步、进程间通信、存储管理及进程调度。 1进程控制 UNIX系统中,用户可以通过一些系统调用对进程进行控制。对应进程的创建、执行和自我终止,UNIX系统提供了相应的系统调用fork()、exec()和exit(),以便在用户级上实现上述功能。,2019/7/7,34,7.4.2 进程控制,(1)进程的创建在UNIX系统中,除了0#进程是在系统引导时被创建外,其他进程都是由父进程通过调用系统原语fork来创建的。 该原语为新建立进程分配一个proc表目并赋予一个唯一的进程标识符pid,此
23、外,内核还将 proc表目初始化。 在UNIX中子进程共享父进程的所有打开文件和当前目录,但并不共享父进程的内存。所以初始化的主要工作是复制父进程的proc表目中的某些项目以共享其打开的文件,复制正文段和当前目录表的表目(i节点),为子进程申请内存并把父进程所有可写的数据段部分复制到内存中去。,2019/7/7,35,(2)进程的执行 子进程被建立后继承了父进程的正文段和数据段,这就限制了子进程可以执行的程序规模。为了扩充子进程的执行能力,使它可以执行不属于父进程的正文段和数据段,UNIX系统提供了一个系统调用原语exec来执行一个新的文件。这使得该进程以在此文件中指出的新的正文段和数据段来调
24、换当前的正文段和数据段。这个操作仅改变进程执行的程序,而并不改变进程的标识符,它在进程树中的位置也未变。,2019/7/7,36,(3)进程的终止在UNIX系统中,一般的用户进程在完成其任务后应尽快予以撤消,以便及时收回其占用的资源。为了及时回收资源并减少父进程的干预,UNIX系统通过系统调用原语exit来实现自己的终结。进程被终止时,关闭所有文件,将当前目录项的访问计数减1,释放正文段。将进程数据ppda写入盘对换区,释放数据段空间,唤醒父进程和1进程,最后,自我终止进程放弃处理机,内核再调度另一进程执行。,2019/7/7,37,2进程的同步和通信 UNIX中对可写的公用变量通常只允许系统
25、进程访问。那么这些系统进程间如何实现临界段互斥执行呢。其主要的方法是: (1)UNIX的调度策略规定在系统进程执行期间发生中断或陷阱时,不进行进程的转换调度。只有在用户程序执行过程中被中断或陷阱、并且在处理中断后返回时,才可以进行进程的调度以重新分配处理机。所以在系统进程执行期间不会有别的进程操作插入。 (2)提高临界段等代码段的处理机中断优先级以屏蔽某些类别的中断,用来防止在系统进程中插入中断和陷阱处理程序时,可能改变进程的状态或修改公共数据等情况。,2019/7/7,38,系统进程还可利用系统调用sleep和wakeup原语实现进程间同步。 sleep原语使调用者进程以指定的原因和优先数睡
26、眠(阻塞) wakeup原语则唤醒在指定原因上睡眠的所有进程。 这两个原语,用户进程是不能使用的,但用户进程之间可以利用核心程序提供的软中断信号机制来实现少量信息的传输和同步。它是某一个进程向另一个与之相关的进程发送一个019之间的数(放在接收进程的proc结构p-sig中)。UNIX系统的进程通信功能是很弱的,为了满足协同进程间的通信需要而设置了这一最简单的通信功能。,2019/7/7,39,4进程调度与存储管理在UNIX系统中进程调度的功能是由一个专门的进程0#进程来负责的,由于UNIX系统的进程调度的主要功能是响应分时用户,所以0#进程包括两部分任务: (1)把进程的映象从内存换出到磁盘
27、; (2)分配处理机。,2019/7/7,40, UNIX系统的进程调度是按照其优先级的高低进行调度的,每次调度拥有最高优先级的进程去占有处理机。每一个进程从它被创建时起,就拥有了一个随时间动态变化的优先级。系统进程的优先级高于用户进程的优先级,其最初的优先级取决于进程所等待的事件,事件优先级的排列次序为:磁盘事件,终端事件,时钟事件和用户进程事件。用户进程的优先级是基于其所使用了的处理机时间的多少而动态地变化,使用处理机时间越长,优先级越低。优先级高的进程优先得到处理机。UNIX每秒为每个用户进程计算一次优先级,优先数愈小,优先级愈高。,2019/7/7,41, 在分时系统中,各交互进程需要
28、经常在内存和磁盘之间进行交换。实际上,任何一个待执行的进程,如果它不能在内存中占据必需的容量,它是不能被执行的。然而,内存是一种有限却很昂贵的资源,它不可能容纳系统中所有活动的进程。 为使内存的紧张状况得到缓解,UNIX系统采用一种交换策略。一个在内存中非运行状态的进程,其进程的映象将被从内存中换出而存入磁盘的对换区中。而一个被选中运行的磁盘上的就绪进程,其映象可以被换入内存。在这两种情况下,均有内存或磁盘空间的分配和释放问题。 在UNIX中内存的磁盘空间的分配和释放模块是相同的,所使用的分配算法是最先适应法。,2019/7/7,42,一个进程在运行过程中如果要求增加分给它的的内存块数时,系统
29、就重新分给它一块足够大的内存空间,并把旧的内存区中的内容复制到新分给的内存区中同时释放旧的内存区。如果进程要求增加内存空间而系统不能满足其要求时,就将该进程换出内存而放入磁盘对换区中,直到以后有足够内存时才将它重新换入内存。所有进程的对换工作全是由0#进程负责 在UNIX系统V中,除具有交换功能外,还支持请求调页的存储管理策略,在这种方式下,一个进程只须将其一部分(页或段)调入内存便可运行。,2019/7/7,43,7.5 设备管理,设备管理的主要任务是管理除CPU和内存之外的所有输入、输出设备。 UNIX系统将设备分为两类: (1)块设备。指以数据块为单位,来组织和传送的数据的设备,如磁盘、
30、磁带等; (2)字符设备。指以单个字符为单位来传送信息的设备,如终端、打印机等。,2019/7/7,44,设备管理,通过前面的学习我们知道,CPU和I/O设备之间存在速度不匹配的问题。在UNIX系统中是如何处理这个问题的呢?UNIX系统在文件系统块设备驱动程序之间,设置了大量的数据缓冲区,这些缓冲区形成一个缓冲池,块设备驱动程序只与缓冲池交换数据。而且UNIX还采用“提前读”、 “延迟写”的技术。即在可能的情况下把用户即将使用的文件内容提前读到缓冲区;将用户写入文件的内容暂放在缓冲区,等到有了相当数量(或缓冲池空间紧张)时再写回磁盘。这样,不必出现用户每次使用文件(读/写)一定导致启动磁盘的现
31、象,从而提高效率;而且还可以将块设备作为字符设备来使用,方便用户。,2019/7/7,45,同理,在键盘、显示器和打印机等字符设备与内存之间也存在存取速度的不平衡,UNIX系统也设置了字符缓冲区以减少这种存取速度的不平衡。,2019/7/7,46,7.6 管道pipe, UNIX系统最重要的贡献之一是提出了关于pipe(管道)的概念 UNIX系统通过系统调用pipe()来创建管道文件。 在核心创建管道时,系统必须为它分配一对文件描述符、一对文件表项以及一个索引节点。如果创建成功,它返回两个文件描述符:fildes0和fildes1,分别对应于管道的入口和出口。于是,写入进程A可用fildes0
32、进行写,读出进程B可用fildes1进行读,因为pipe文件一次存放量不多于4096个字节,因此利用管道一次最多可传送4096个字节。 两进程对pipe文件的访问必须是互斥的。UNIX为此设置了一个管道封锁标志,其作用类似于以P,V操作实现互斥的功能。图7-5给出了管道工作原理。,2019/7/7,47,管道pipe, 每当进程访问pipe文件前,先检查一下该索引节点是否已经上锁。若已经上锁,则进程便睡眠等待,否则它将索引节点上锁,然后进行读或写操作。 因为pipe文件一次存放量不多于4096个字节,所以写进程只能超前读进程最多为4096个字节。若超前多于4096个字节,系统会对索引节点作出标
33、志,让写进程等待;而当pipe文件读空,系统也会让读进程等待;若整个pipe文件传输量大于4096个字节,则分批传送。pipe机构中的这些互斥、同步、缓冲区管理完全由系统自动进行,用户没有必要考虑。,2019/7/7,48,图 7-5 管道工作原理,2019/7/7,49,7.7 系统调用,系统调用的主要目的是使得用户可以使用操作系统提供的有关设备管理、输入输出系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以提高资源利用率的作用。UNIX系统的系统调用以标准实用子程序的形式提供给用户在编程中使用,从而减少用户程
34、序设计和编程难度,节省用户的程序设计和编程时间。,2019/7/7,50,系统调用, UNIX系统的系统调用大致分为以下几类: (1)与进程管理有关的系统调用,如创建进程的调用fork、进程自我终止用的exit、将调用进程挂起的wait等等。 (2)与文件管理有关的系统调用,主要包括文件的打开open、关闭close、读read、写write、创建creat和删除unlink等。 (3)与设备管理有关的系统调用,如系统调用read,write可用来对执行设备进行读写,系统调用open和close可用来打开和关闭某一指定设备等。 (4)与存储管理有关的系统调用,如获取现有内存空间大小的调用、改变
35、堆栈大小的系统调用等。 (5)其它的一些系统调用。,2019/7/7,51,7.8 SHELL语言简介, SHELL是UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。 SHELL作为语言来说,它既是终端上的用户与UNIX操作系统会话的语言,又可作为程序设计的语言,所以SHELL是用户与系统之间的接口,而且是一种比较高级、易被用户理解和使用的程序设计语言,它为用户提供了使用方便、功能强、又容易扩充的程序设计环境。,2019/7/7,52,7.8 SHELL语言简介,1SHELL的一般用法 (1)一般命令一般命令是由一个命令名和用空格分隔的多个参数名所组成(参数名可为空)。例如用户
36、打入如下命令pwp 该命令就显示出该用户的当前目录的路径名(由根目录开始的完整路径名)。又如ls -1 ls是命令名,它打印当前目录中的所有文件名。-1是参数,它要求该命令不但要打印当前目录中的文件名,而且还要给出每个文件的存取控制、联接数、文件主、文件大小和生成日期。,2019/7/7,53,系统提供的简单命令有100多条,下面只给出最常用的几条: login 向系统注册命令 ed 文本编辑命令 cc 调用C编译程序编译文件 cal 显示日历 date 显示并设置日期 cp 复制文件 cate 连接并显示文件 ls 列出当前目录内容 pr 打印文件,2019/7/7,54,ps 显示进程状态
37、 mail 在用户之间发送或接收信件 mkdir 构造一个文件目录 cd 改变工作目录 rm 删除文件 mv 换文件名或移动文件,2019/7/7,55,(2)后台命令 用交互方式使用简单命令,用户必须等待前一命令执行结束在终端上出现提示符$之后,才能打入下一命令。为了提高系统和用户的工作效率,可以让那些执行时间较长而且执行过程中不一定需要与用户进行交互作用的命令,放在后台执行。此时只要在该命令后加一个后台命令运算符“ ed p1 lsdir& ed p1这两组命令中,前一组是将当前目录中的内容放到“dir”文件中后,才能开始编辑文件p1,而后一组则是将前一个任务转为后台运行,而前台可同时进行
38、编辑文件p1的工作,2019/7/7,56,(3)输入输出重新定向 UNIX的标准输入设备和输出设备分别是终端设备键盘和显示器,所以除非由用户作了改变,否则标准输入来自键盘,而标准输出则是送到显示器。 但用户可以指定文件或其他设备作为Shell的输入、输出设备,这就是输入输出重新定向的功能。此功能允许用户指定一个文件代替输入或输出设备,并用符号“”、“”分别来表示输入和输出的重新定向。,2019/7/7,57,例如ls 命令是在终端屏幕上列出当前目录的内容,而命令lsfile 则是输出重定向,当前目录的内容不再列到显示器上而是列入到file中。若file文件不存在,则建立此文件,否则将新内容取
39、代旧内容。而命令:lsfile 也是输出重定向,只不过是将输出内容附加到file的末尾。 标准输入也可以重定向。例如:wcfilewc命令的功能是将标准输入文件包含的行数、字数送向标准输出,即在终端屏幕上显示出刚刚敲进的文件的行数和字数。现在使用了标准输入转向符“”,wc命令是将指定的文件file中的行数、字数显示出来了。,2019/7/7,58,(4)管道命令 用户使用管道功能,除了在程序级可使用pipe系统调用外,还可以在作业控制级直接使用Shell的管道命令,只要在两个命令之间加上管道符“|”即可。例如:cat file1 file2 | wc此命令把file1,file2连接后产生的文
40、件作为wc命令的输入,即在屏幕上显示出file1和file2连接之后的总行数和总字数。 Shell除了上述命令之外,还可以构成组合命令,支持“?”、“*”、“”等文件名参数的匹配方式以及特殊字符的转义等。,2019/7/7,59,2Shell过程 Shell除了提供交互的命令方式外,还可用另一种方式使用它,即命令文件的方式。 我们可以像使用程序设计语言一样用shell编程。Shell 本身可以设置参数和变量,并且还提供了类似于一般程序设计语言中的控制语句和条件语句。因此,与我们平常所说的编程的不同之处就是shell编程的对象是系统命令。用 shell命令语言编制成的程序文件就叫做shell过程
41、。,2019/7/7,60, Shell 过程的使用方式如下: $ sh filename args 其中,file是shell过程文件,sh表示调用shell解释程序来执行此过程。方括号中是参数,它们可以传送到shell过程中的指定位置。而在shell过程中,用$1引用第一个参数,用$2引用第二个参数,这里$1,$2,$9,称为位置变量,最多可有9个。,2019/7/7,61,下面我们就对shell编程作以简单的介绍。 (1)Shell变量 Shell只处理字符串变量。变量以字母开头,由字母、数字和下划线所组成。变量可以如下方式赋值,例如user=xyf 把值xyf赋给变量user。 对于经
42、常使用的较长的字符串可以用变量加以缩写,例如 b=/home/teachers/xyf 用变量b代替路径名/home/teachers/xyf,以后凡是用到目录名/home/teachers/xyf之处,均可用$b代替,从而简化了操作。 变量还可通过命令set赋值,如:set aa bb ,这就分别为shell过程中的位置参数$1、$2赋值aa、bb。,2019/7/7,62,(2)Shell控制结构 1)条件控制if if语句的语法格式为:if 条件表达式then 命令序列1else 命令序列2fi2) 循环控制 for 语句的语法格式是:for 变量in变量值do 命令序列done,201
43、9/7/7,63,循环控制的另一个语句while的语句格式为:while 条件表达式do 命令序列done 3)分支结构 case的语法格式:case 变量 in值1)命令序列1;值2)命令序列2;*)命令序列n;esac,2019/7/7,64,本章小结, UNIX操作系统是一个多用户、多任务的通用的分时系统, 它具有分层的、可装卸的文件系统。UNIX 把文件、目录、设备均看作文件,统一进行管理。 UNIX以进程为基本的调度单位,采用动态的优先数调度算法,按照进程优先级别的高低进行调度。 UNIX系统非常突出的贡献之一管道,利用它可以非常方便地实现进程间的同步通信。 UNIX还提供了功能完备、使用灵活的命令语言,即shell语言,用户可以通过它与系统进行交互,也可以利用它方便地使用UNIX系统提供的各种程序设计工具。,