浙师大Linux操作系统期末复习_第1页
浙师大Linux操作系统期末复习_第2页
浙师大Linux操作系统期末复习_第3页
浙师大Linux操作系统期末复习_第4页
浙师大Linux操作系统期末复习_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux操作系统期末复习题型:选择题(20个20分)填空题(10个10分)简答题(9个45分)编程题(5个25分)操作系统的演变单道批处理系统(batchsystem)串行执行预先组织好的一组任务提高了系统效率。多道批处理系统

可以交错运行多个程序再次提高系统效率。典范:为IBMSystem/360机开发的OS/360分时系统(TimeSharingSystem)将处理器的运行时间分成数片,均分或依照一定权重派发给系统中的用户使用快速响应典范:Multics,Unix操作系统的发展操作系统的演变实时系统(RealTimeSystem)

系统能及时响应外部事件的请求应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域典范:VxWorks操作系统的发展<>历史悠久的Unix为了改进批处理系统不令人满意又缺乏效率的方案,Dartmouth大学和MIT发明了分时(timesharing)系统。Dartmouth的系统只能运行Basic程序并取得短期的商业效益,而MIT的系统CTSS则是为通用的分时系统开发的,并在科研领域取得了巨大成功。1965年在美国国防部高级研究计划署DARPA的支持下,MIT、AT&TBellLab和GE决定开发一种“公用计算服务系统”,希望能够同时支持整个波士顿所有的分时用户。该系统称作Multics(MULTiplexedInformationandComputingService)。<>历史悠久的Unix

Multics设计目标是通过电话线把远程终端接入计算机主机。但是,Multics研制难度超出了所有人预料。长期研制工作达不到预期目标,1969年4月贝尔实验室退出,通用电气公司也退出了。Multics引入了许多现代操作系统领域的概念雏形,比如分级的文件系统,与设备独立的用户接口等思想,这些对随后操作系统特别是Unix的成功有着巨大的影响。<>历史悠久的Unix

1969年,贝尔实验室退出Multics研制项目后,KenThompson和DennisM.Ritchie两个研究人员一台无人用的PDP-7上重新摆弄原先在Multics项目上设计的“空间旅行”游戏。为了使游戏能够在PDP-7上顺利运行,他们陆续开发了浮点运算软件包、显示驱动软件,设计了文件系统、实用程序、shell和汇编程序。1970年,在一切完成后,给新系统起了个同Multics发音相近的名字Unix。注:PDP-7是美国DEC公司生产的小型机,其系列还包括PDP-11/40/45等机型。历史悠久的Unix最初的Unix是用汇编语言编写的。不久,Thompson用他自己设计的一种较高级的B语言重写了该系统。但由于B语言的缺陷,Ritchie后来对B进行了改进,取名为C,接着又为C写了一个很不错的编译器。Thompson和Ritchie合力用C语言重写了Unix。C语言正是一种应运而生的编程语言,直至今日仍然统治着系统程序编程领域。

1974年,Ritchie和Thompson在CACM上发表了一篇关于Unix里程碑式的论文—TheUNIXTime-SharingSystem。由于他们的卓越成就,他们于1983年被授予著名的图灵奖。

KenThompsonC语言之父DennisM.Ritchie<>AT&T的SystemⅤ论文发表后,很多大学纷纷向贝尔实验室索要UNIX的拷贝。由于贝尔实验室的母公司AT&T当时是一家受限制的垄断企业而不能涉足计算机领域,所以AT&T没有向这些大学收取费用。1984年,AT&T被美国政府分成了几个子公司,这样,它就可以合法地建立一个计算机子公司。很快,AT&T推出了它的第一个UNIX商业版本,SystemⅢ。但由于反映不尽如人意,翌年另一个改进版本SystemⅤ取代了它,而不为人知的SystemⅣ则成为计算机科学史上的一个谜。最早的SystemⅤ相继被它的2、3、4版本代替,每一个版本都比它的前一代更庞大、更复杂。在此过程中,当初设计UNIX的初衷——一个简洁、优美的系统—被逐渐抛到脑后。<>伯克利的UNIX—BSD加州大学伯克利分校是早期获得第6版UNIX的大学之一。由于拥有完整的源代码,伯克利得以从根本上修改UNIX。在DARPA的资助下,伯克利分校为PDP-11设计并发布了一个改进版本,叫作1BSD(FirstBerkeleySoftwareDistribution)。很快又有了2BSD。更为重要的是为VAX编写的3BSD及其下一代产品4BSD。4BSD(包括4.3BSD和4.4BSD)有了很大改进。首先是虚拟内存和分页的使用,根据需要动态调入或调出内存页面,从而使得运行的程序能够大于物理内存。另一个改进是允许文件名可以多于14个字母。网络的加入最终使BSD的网络协议——TCP/IP成为比其他任何官方标准(如OSI)都更为广泛使用的实际上的标准。伯克利的UNIX—BSD伯克利还在UNIX中加入了很多实用程序,包括一个新的编辑器(vi)、一个新的shell程序(csh)以及Pascal和Lisp的编译器等等。这些进步使得Sun、DEC和其他计算机厂商将它们的UNIX版本基于伯克利的UNIX而不是AT&T的官方版本SystemⅤ。结果,伯克利的UNIX成为教学、科研和安全领域的主流。UNIX的标准化进程到了80年代后期,两个不同的、互不兼容的UNIX版本——4.3BSD和SystemⅤRelease3都在广为使用。另外,每一个UNIX供应商事实上又在原有UNIX系统的基础上加入了一些自己的非标准的东西。UNIX世界群雄割据,又没有标准的二进制程序格式,这样就严重阻碍了UNIX的商业成功,因为软件开发商不可能写出一个适用于所有UNIX系统的程序。

第一次尝试将这两大UNIX统一起来的是IEEE标准委员会,这个项目被命名为POSIX,前三个字母代表可移植的操作系统(PortableOperatingSystem),加上IX是为了让名字更加UNIX化。

POSIX委员会制定出一个称为1003.1的标准.UNIX的标准化进程然而,一些软件供应商,包括IBM、DEC、HP等并不喜欢AT&T对UNIX平台的控制,因此它们建立了一个称为OSF(OpenSoftwareFoundation,自由软件联盟)的联盟,开发了一个符合所有IEEE和其他标准的系统,这个系统包含很多其他特色,如窗口系统(X11)、图形用户界面(Motif)、分布式计算(DCE)、分布式管理(DME)。针对OSF的出现,AT&T建立了一个自己的联盟UI(UNIXInternational),事实上做的是相同事情。UI的UNIX是基于SystemⅤ的。结果是,有两个工业集团提供各自的UNIX版本,因此使用者距离标准化反而较最初更远了。另外,IBM还有自己的UNIX变种AIX,其他公司也各自拥有UNIX变体,混乱依然存在。UNIX的一些变种

IBMAIXSUNSolarisHPHP-UXFreeBSDLinuxiOSAndriod(❤会出选择题让你选择下面哪个不是UNIX系统)Minix由于Unix的商业化导致源代码不公开,大学里讲授操作系统只能略去Unix的内容而只讲操作系统理论。不幸的是,只讲理论使学生对实际的操作系统产生一个片面的认识。书本中作为重点讲述的内容,如进程调度算法,实际中并没有那么重要;而实际中很重要的内容,如I/O系统和文件系统又因为缺乏理论性而被忽略。

Minix为了扭转这种局面,荷兰阿姆斯特丹Vrije大学计算机科学系的坦尼鲍姆(AndrewS.Tanenbaum)教授决定编写一个在用户看来和UNIX完全兼容,然而内核全新的操作系统Minix。Minix没有借用AT&T一行代码,所以不受许可证的限制,它可以被班级和个人用来学习。通过它读者可以剖析一个操作系统,研究其内容如何运作。其名称源于“小Unix”,因为它非常简洁,一般程度的读者都可以读懂它。

Minix的内容大家可参阅坦尼鲍姆撰写的教材《操作系统:设计与实现》及http://www.M网站。

Minix和Linux的关系在Minix发布后不久,便出现了一个面向它的USENET新闻组,在数周内便有多达40000个用户订阅该新闻组。其中的大多数人都想向Minix中加入一些新特性以使其更强大、更有用。每天都有数百人提供自己的建议、思想甚至代码。而Minix的作者在几年内一直坚持不采纳这些建议,目的是使Minix保持足够的短小精悍,以便于学生理解。人们最终意识到不可能动摇作者的立场,于是一个芬兰学生LinusTorvalds决定编写一个类似于Minix的系统,但是它特征繁多、面向实用而非教学,这就是Linux。自由而奔放的黑马-Linux诞生于学生之手成长于Internet壮大于自由而开放的文化TuxLinux的形象代表Linux:为x86体系结构开发的类Unix操作系统Linux之父-LinusTorvalds芬兰、赫尔辛基大学、1990起始于写两个进程然后写驱动程序、文件系统、任务切换程序,从而形成一个操作系统雏形,并把它放在Internet上供大家下载修改Linux得以流行的原因之一-遵循POSIX标准POSIX表示可移植操作系统接口(PortableOperatingSystemInterface)POSIX是在Unix标准化过程中出现的产物。POSIX1003.1标准定义了一个最小的Unix操作系统接口任何操作系统只有符合这一标准,才有可能运行Unix程序Linux的肥沃土壤-GNUGNU是GNUIsNotUnix的递归缩写,是自由软件基金会的一个项目。RichardStallman建立了GNU项目,要创建一个能够自由发布的类UNIX系统。

GNU项目产品包括emacs编辑器、著名的GNUC和Gcc编译器等,这些软件叫做GNU软件。GNU软件和派生工作均适用GNU通用公共许可证,即GPL(GeneralPublicLicense

)Linux的开发使用了众多的GNU工具GPL-开源软件的法律GPL允许软件作者拥有软件版权但GPL规定授予其他任何人以合法复制、发行和修改软件的权利。自由软件运动的教父-RichardStallman理查德·马修·斯托曼,1953年出生于美国纽约曼哈顿地区,1971年进入哈佛大学学习,同年受聘于麻省理工学院的人工智能实验室(AILaboratory)。他是自由软件运动的精神领袖、GNU计划以及自由软件基金会(FreeSoftwareFoundation)的创立者、著名黑客,Gcc,Emacs等软件的作者。他最大的影响是为自由软件运动竖立了道德、政治以及法律框架。

<>Linux系统或发布版

符合POSIX标准的操作系统内核、Shell和外围工具。

C语言编译器和其他开发工具及函数库XWindow窗口系统各种应用软件,包括字处理软件、图象处理软件等。流行的Linux发布版本Slackwarelinuxredhatlinux

fedoraDebianlinux

UbuntuLinuxSuSElinuxTurbolinux红旗linux流行的开源软件ApacheMySQLOpenofficePHPPerl

用户登录到Linux后,每时每刻都处在某个目录之中,此目录称为工作目录(WorkingDirectory)或当前目录(CurrentDirectory)。工作目录是随时可以改变的。工作目录用”.”表示,其父目录用”..”表示.为了方便多用户管理,Linux中一般用户在/home下都有自己的主目录,例如用户zhang的主目录是/home/zhang.用户可以用“~”引用自己的主目录。对文件进行访问,需要用到路径(Path)的概念.路径是从某个目录到某个文件的一条道路。路径主要由目录名称构成,目录之间用“/”分开。路径分为相对路径和绝对路径.绝对路径是指从“根”开始的路径;相对路径是指从用户工作目录开始的路径。Linux的文件系统基础

/bin这个目录存放着最经常使用的命令。/boot存放的是启动Linux时使用的一些核心文件,包括一些链接文件以及镜像文件。/dev该目录下存放的是Linux的外部设备,称为设备文件。在Linux中访问设备的方式和访问文件的方式是相同的。/etc这个目录用来存放所有的系统管理所需要的配置文件和子目录。/home用户的主目录,在Linux中,每个用户都有一个自己的目录,例如用户zhang的主目录为/home/zhang.Linux的文件结构/lib这个目录里存放着系统最基本的动态链接共享库/lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。/mnt系统提供这个目录是为了让用户临时挂载别的文件系统。/proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。/root超级管理员的主目录。Linux的文件结构/sbins就是SuperUser的意思,这里存放的是系统管理员使用的系统管理程序。/tmp这个目录是用来存放一些临时文件的。/usr要用到的很多应用程序和文件几乎都存放在该目录下。

/var这个目录中存放着在不断扩充着的东西,习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件,电子邮件。Linux的文件结构通配符bash下使用的通配符:?代表任何单一字符*代表任何字符串,可以是空串[字符组合]在中括号中的字符皆符合,例[a-z],[ace][!字符组合]不在中括号中的字符皆符合,例[!0-9]命令格式:command[-options][arguments]多用户管理:adduser,deluser,passwd,su,who,id目录相关的:pwd,cd,mkdir,rmdir,ls文件相关的:cp,mv,rm,chmod,whereis注销及关机:logout,halt,reboot,exit查看和编辑文本:less,more,cat,vi其他命令:man,startx,history,tar,gzip,echo,bc,wc,cut,grep,sort,head,tail等(❤cpba/c把b复制到a中并取名为ccat后不加任何参数作用是复制输入,以Ctrl+d结束输入状态(而一般的是以q退出))Linux常用命令

adduser添加新用户,只能由root来做这件事deluser删除用户passwd修改口令(切忌以root单独敲passwd命令)su切换用户,root可以切换到任意其他用户而不需要口令who显示当前登陆用户id显示用户标识符用户管理涉及到的文件帐户管理/etc/passwd用户口令管理/etc/shadow用户组管理/etc/group多用户管理命令每个进程都有当前工作目录这一属性。pwd(printworkingdirectory):显示当前工作目录。cd(changedirectory):改变当前工作目录,参数可使用相对路径或绝对路径mkdir创建新目录rmdir删除指定空目录

(❤rm-rdir删除非空目录rm*删除当前目录下所有文件,但目录不删除)tree显示当前目录下的文件系统结构。ls(list):显示目录列表,常用选项:-l长格式显示,-a显示所有文件,-i显示索引节点号,例:

ls–l*.c目录相关命令

Linux下的主要文件类型:常规文件(-):文本文件和二进制文件目录文件(d):将文件的名称和它的索引节点号结合在一起的一张表(记住:目录也是文件)设备文件(corb):每种I/O设备对应一个设备文件管道文件(p):主要用于在进程间传递数据,又称先进先出(FIFO)文件链接文件(L):又称符号链接文件,它提供了共享文件的一种方法

文件类型Linux给文件设定了一定的访问权限

Linux对文件的访问设定了三级权限:文件所有者,与文件所有者同组的用户,其他用户。对文件的访问主要是三种处理操作:读取、写入和执行

访问权限和文件模式

cp复制文件,cpsourcedest,常用选项-rrm删除文件或目录,常用选项-f,-rmv移动或重命名现有的文件touch创建空文件或更改文件访问时间chown改变文件属主(只能root使用)chmod改变文件权限。whereis确定文件所在位置。文件相关命令

logout注销用户halt关机(只能root使用)reboot重启(只能root使用)exit结束当前进程注销及关机命令catmore分页显示less功能同more,但更强大,可回滚。建议使用less查看文本catcat是“catenate”的缩写,意思是连接在一起。它接受多个文件名参数,并把它们复制到标准输出。要是没有参数将会将输入作为输出。catfile1file2查看文本$vifilename进入命令行方式命令行方式下敲i或a转入插入编辑方式插入编辑方式下按Esc回到命令行方式命令行方式下敲“:”,”/”,”?”到末行命令方式配置文件~/.exrc在编辑模式下按ctrl+p匹配单词vim简介hjkl移动光标x删除光标所在的字母dw从光标处删除至一个单词的末尾d$从光标处删除至行末dd删除本行y(yank)复制,如yw,y2wY将当前行拷贝到缓冲区p(put)将缓冲区内容拷贝至光标下一行u(undo)取消上一次操作命令(❤删除掉的内容被保存在了缓冲区,直接粘贴即可)命令行方式下的常用命令/word往下搜索word?word往前搜索word:s(substitute)查找及替换,如:1,$s/word/newword/g

:wq写盘并退出

:q!强行退出

:setnu设置编辑时显示行号:setai文本的每一新行均与上行对齐(❤永久显示行号vi.exrc|setnu)末行命令方式下的常用命令正则表达式的元字符集^锚定行的开始^tom$锚定行的结束tom$

(❤^$匹配空行)\<锚定单词的开始\<cat\>锚定单词的结束John\>.匹配一个字符,相当于shell中?*代表0个或多个先前字符,ab*[]匹配字符组中的一个字符[Tt]om[x-y]匹配以字符范围组成的组中的一个字符[^]匹配一个不在范围内的字符\用来转义一个字符man获取联机帮助,如manls,退出按qclear清屏date显示或设置系统日期和时间cal显示万年历,cal081992startx启动X会话,进入X11图形环境history显示历史命令其他命令echo显示一行文本,echo“helloworld”tar打包(归档),选项-zcvf、解包,-zxvftar–zcvfdir.tar.gzdirtar–zxvfdir.tar.gzgzip,gunzip压缩、解压文件(❤od-cfile以字符形式显示不可见的字母)其他命令Unix系统中有很多工具执行文本转换功能,这些工具称为过滤器(Filters)wc计数函数,常用选项:-l:统计文件的行数;–w:统计单词个数;–c统计字节个数wcfile其他命令uniq删除连续重复行,常用选项:-c重复数前置uniqfilehead输出文本的前十行(默认),常用选项:-n指定行数tail输出文本的后十行(默认),常用选项-n其他命令cut按列或按域截取输入行中所指出的内容(25页),常用选项:-d制定定界符-f按域截取,例:cut–f1,3-5filecut–d:-f1/etc/passwd其他命令

tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。(❤对原文件没有影响)

注意:tr只能进行字符的替换、缩减和删除,不能用来替换字符串。选项–d:删除字符集中的字符–s:将连续出现的字符压缩成一个

-c取字符串中字符集的补集

其他命令Example:catfile|tra-zA-Ztr“ab”“cd”<filetr‘’‘\n’<filetr:‘\t’</etc/passwdtr–s‘\n’<filetr–d‘\n’<filetr–d“hello”<file只要出现“h”、“e”、“l”、“o”就删除,并非只删除hello串其他命令问题:统计名著hamlet中出现频率最高的前十个单词。tr–sca-zA-Z‘\n’<hamlet|sort|uniq–c|sort–nr|head其他命令grep全程查找正则表达式并打印(27页)模式为正则式,若出现元字符用单引号括起来。例:grepJohnbookls–l|grep‘^d’ls–l|grep‘^…….rw’grep‘\.bat’file其他命令C语言编译系统预处理器源程序修改后的源程序可重定位的目标程序可重定位的目标文件库编译器汇编器汇编程序连接器可执行的目标程序

C源程序可以分成若干个模块

分别进行预处理、编译和汇编、形成可重定位的目标文件目标文件和必要的库文件连接成一个可执行的目标文件

gcc和cc是编译驱动程序的名字

GCC简介

GCC常用选项-S,-c,-o例如当前有个hello.c源程序:$gcchello.c//生成a.out可执行程序$gcc–Shello.c//只编译,生成hello.s汇编程序$gcc–chello.c//编译及汇编,但不链接,生成hello.o目标文件$gcc–ohellohello.c//编译汇编及链接,生成hello可执行程序(❤运行程序./a.out)多命令行:可将多个命令写在同一个命令行中,命令之间用分号隔开,如

$pwd;ls-l多行命令:通过转义字符”\”写多行命令<>shell开启终端:ctrl+Alt+T(Ubuntu)可通过上下箭头翻看已执行过的命令,或通过history显示历史命令可通过Tab键匹配文件名用Ctrl+Z挂起进程(可通过fg恢复其前台运行)Ctrl+Alt把鼠标从虚拟机中释放字符界面下,通过ALT+F1/F2/F3新建终端tty做普通工作时尽量不使用root帐号bash使用小技巧shell的基本功能

命令的解释执行环境变量的设置输入/输出重定向shell程序设计输入/输出重定向:UNIX下流的概念

Linux自动为每条执行的命令(进程)打开三个文件,分别用于读取输入数据、发送输出数据和错误信息,这三个文件分别叫标准输入(stdin)、标准输出(stdout)和标准错误文件(stderr)

信息流的标准定义:标准输入流(stdin):文件描述符0,默认为键盘.标准输出流(stdout):文件描述符1,默认为显示器.标准错误流(stderr):文件描述符2,默认为显示器.输入/输出重定向输入输出重定向就是对系统信息流标准定义的修改输入重定向

<

例:prog<infile输出重定向

>,>>例:pwd>outfilels–l>>file1例:$prog<infile>outfile错误流重定向>&

例:gcchello.c>&log管道线(pipeline)的概念

在命令中利用管道线(|)将命令隔开,实现将一个程序或命令的输出作为另一个程序或命令的输入.例:$ls-l|wc-l$ls–l/dev|grepfd$catfile|grephello|wc-l如果不用管道线,该如何实现这一功能?环境变量是系统预定义的一些变量,如PATH,LOGNAME等变量,例如:echo$PATH查阅命令env相关文件:/etc/profile,~/.bash_profile,~/.bash_login

~/.profile<>环境变量的设置

shell程序:一种解释执行的脚本(script)语言,类似于DOS下的.bat文件,但功能更强.shell是按行解释执行的,注释在行首加#,习惯文件的第一行以”#!/bin/sh”开头,指明使用哪种解释器.执行方式(三种):$sh<file.sh$shfile.sh首先修改shell程序的权限为用户可执行,如:$chmod755file.sh

然后在命令行下直接输入:$./file.sh(未打通路径,若打通路径,./不需要)ShellProgrammingshell的变量通常只有字符类型,在shell编程中也会出现一些数值计算的量,但它们也是基于字符类型完成的。变量的赋值.例:UNIX=SystemV

或UNIX=“SystemVOS”变量的引用:在变量名前加$,如

$UNIX或${UNIX}${UNIX}tm打通路径:$PATH=$PATH:$HOME//$HOME代表需要添加到路径变量中的目录名

(❤看打通了没有echo$PATH)shell变量的使用不同的引号对shell变量产生不同的效果.1)单引号’’:shell将单引号中的内容看成纯粹的字符串,如:

$file=report$echo’Thetimeis`date`,thefileis$file’结果:Thetimeis`date`,thefileis$file2)双引号””:shell对双引号中的特殊字符进行解释,如:$echo“Thetimeis`date`,thefileis$file”3)反引号``:对反引号中的内容作为shell命令执行,如:

$TT=`date`$echo$TTshell变量的使用命令的位置变量在shell中命令的位置变量类似于C语言中argc和argv参数的功能,它们主要对命令行中各个参数的位置进行描述。记住$#,$*,$?,$$,$!的定义$#位置参数的个数$*用单字符串显示传递参数$?为前一命令返回的状态值(0为正常)$$当前shell进程的pid值$!最近访问的后台进程的pid值shell变量的使用例echoarg.sh内容如下:echo$#forVARin$*doecho$VARdone运行:$echoarg.shfirstsecondthird$0$1$2$3结果:3

firstsecondthirdshell变量的使用格式:testexpre或[expre]

当表达式的值为真时,test命令返回真值0,否则返回假值非0.对文件特性的测试:test–[dfrwxs]file对字符串内容的测试:

建议访问变量使用”$var”的形式对整数的测试例:x1=“005”,x2=5,注意:$test“$x1”=“$x2”和$test“$x1”-eq“$x2”的区别test命令的使用if语句(1)无分支条件语句:ifthen(2)二分支条件语句:ifthenelse

(3)多分支条件语句:ifthenelif

<>条件控制语句格式:if[condition]thencommandsfi

例:if[$#=1]thencp$1$HOME/user1fivi$1exit0无分支条件语句格式:if[condition]thentrue-commandselsefalse-commandsfiP77例5.5二分支条件语句格式:if[condition_1]thencommands_1elif[condition_2]thencommands_2elif[condition_3]thencommands_3…….elsecommands_nfi多分支条件语句例5.7:#!/bin/shif[$#-lt3]thenecho“usage:`basename$0`arg1arg2arg3”>&2exit1fiecho“arg1:$1”echo“arg2:$2”echo“arg3:$3”分支条件语句例5.8:testdir#!/bin/shDIREC=$1if[-z`ls–a$DIREC`]thenecho“$DIRECisindeedempty”elseecho“$DIRECisnotempty”fi运行时可输入:$testdir/home/user1例5.9自己看分支条件语句case语句:casein结构casewordinpattern-1)pat1-list1;;pattern-2)pat2-list2;;……*)default-list;;esac<>条件控制语句例5.10:case$#in1)cat>>$1;;2)cat>>$2<$1;;*)echo“usage:append.sh”;;esac条件控制语句例5.11:#!/bin/shhour=`date+%H`//加号之前有一空格case$hourin0[1-9]|1[01])echo“Goodmorning!”;;1[234567])echo“Goodafternoon!”;;*)echo“Goodevening!”;;esac例5.12:条件控制语句for循环:forindone结构while循环:whiledodone结构until循环:untildodone

<>循环语句for循环:forindone结构forvariableinlist-of-valuesdocommands……last-commanddone

<>循环语句例5.13:#!/bin/shcd$HOMEfordirinccworkdoecho“….in$dir”cd$dirforfilein*.[c]dols–l$filedonecd..done循环语句while循环:while-do-done结构只要循环条件为真就继续循环下去。while[condition]docommands……last-commanddone例5.14<>循环语句until循环:until-do-done结构只要循环条件为假(非0值)就继续循环下去。until[condition]docommands……last-commanddone另外,和C语言一样,break和continue语句也可以使用。<>循环语句例5.15uonuntilwho|grep“$1”>/dev/nulldosleep30doneecho“07\07$1isloggedon.”exit0运行:$uonlili&循环语句expr是对shell变量进行算术运算的操作.例:$count=0$count=$count+1$echo$count显示为0+1$count=`expr$count+1`$echo$count显示为1expr命令在程序中显示错误信息

echo“usage:``basename$0`arg1arg2”>&2将不必要的信息送入系统垃圾文件/dev/null(黑洞)中例5.17#!/bin/shifcpmyfilemyfile.bak>/dev/null2>&1thenecho“goodcopy”elseecho“`basename$0`:errorcouldnotcopythefiles”>&2fishell编程中常用的其他语句在程序运行中读取标准输入流信息

read[word1][word2]…[rest]注意:read语句每次接受输入以换行(回车)结束,将输入按照IFS(默认为空格,Tab,回车)定义的分隔符分成不同的域。见例5.18shell编程中常用的其他语句例5.18read_test#!/bin/shecho”givemealongsentence:”readword1word2restecho–e“$word1\n$word2\n$rest”echo”endofmyact.”

运行后输入:let’stestthereadcommand.输出:let’stestthereadcommand.endofmyactshell编程中常用的其他语句交互式调试利用多窗口多进程边调试、边编辑用shell程序提供的跟踪功能进行调试

-v–x选项<>shell程序的调试方法

假设score.txt文件中保存两个班级的同学的数学成绩,请编写一个shell程序计算每个班级的学生人数和平均分。score.txt内容如下:wangpin:class1:87wubo:class2:96zhanghua:class1:65xiaonong:class2:88jiangbo:class2:93……shell程序举例#!/bin/shSCORE1=0SCORE2=0NUMBER1=0NUMBER2=0SAVEDIFS=$IFSIFS=:INFILE=score.txtshell程序举例whilereadNAMECLASSSCOREdocase$CLASSinclass1)NUMBER1=`expr$NUMBER1+1`SCORE1=`expr$SCORE1+$SCORE`;;class2)NUMBER2=`expr$NUMBER2+1`SCORE2=`expr$SCORE2+$SCORE`;;*);;esacdone<$INFILEshell程序举例SCORE1=$(echo"scale=2;$SCORE1/$NUMBER1"|bc)SCORE2=$(echo"scale=2;$SCORE2/$NUMBER2"|bc)echo"classstudentnumberaveragescore"echo"-----------------------------------------"echo"1$NUMBER1$SCORE1"echo"2$NUMBER2$SCORE2"shell程序举例提示:windows系统中敲入一个回车,会生成两个字符:\r\n,即回车换行(CRLF:carriagereturn/linefeed),而linux下只会生成一个\n.所以要是windows记事本里敲入的文本传到linux下面使用,应把\r字符删除:$catfile|tr–d‘\r’>file.bakshell程序举例并行与并发现代计算机系统提供多道程序运行环境,这种环境可以由多处理器结构构成,也可以由单处理器结构构成。并行(Parallelism):多个程序在不同的处理器上同时运行。并发(Concurrency):多个程序在单个处理器上按照一定规则进行切换,轮流运行。由于切换迅速,给用户的感觉是每个用户独占自己的cpu,宏观上面看起来并行。在操作系统中引入进程的目的,就是为了使多个程序能够并发执行。进程的概念进程(process)的概念:进程就是执行中的程序,或者说是程序的一次执行。程序是一个静态的概念,进程是一个动态的概念进程是操作系统资源分配和调度的基本单位。进程介绍-程序和进程

Linux进程状态Linux下的进程状态:TASK_RUNNING(运行,R):进程是可执行的;它或者正在执行,或者在运行队列中等待执行。TASK_INTERRUPTIBLE(浅度睡眠,S):进程正在睡眠,等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为接收到信号而提前被唤醒并投入运行。TASK_UNINTERRUPTIBLE(深度睡眠,D):除了不会因为接收到信号而被唤醒,这个状态与可打断状态相同。Linux进程状态Linux下的进程状态:TASK_ZOMBIE(僵尸,Z):该进程已经结束,但其父进程还没有调用wait4()系统调用回收该子进程的残骸。TASK_STOPPED(停止,T):进程停止执行;进程没有投入运行也不能投入运行。进程控制块-Linux进程状态及转换fork()TASK_RUNNING就绪TASK_INTERRUPTIBLE浅度睡眠TASK_UNINTERRUPTIBLE深度睡眠TASK_STOPPED暂停TASK_ZOMBIE僵死占有CPU执行do_exit()schedule()ptrace()schedule()时间片耗尽等待资源到位sleep_on()schedule()等待资源到位interruptible_sleep_on()schedule()资源到位wake_up_interruptible()或收到信号wake_up()资源到位wake_up()收到信号SIGCONTwake_up()进程管理

ps(processsnapshot):查看进程状态,常用选项-ef,-auxtop:实时显示进程信息pstree:显示进程树进程管理前台进程:前台进程控制着终端,当进程没有结束时,你不能执行其他命令。Ctrl+Z:挂起(suspend)前台进程,使进程处于停止状态(stopped)Ctrl+C:终止前台进程后台进程:后台进程以较低的优先级运行,那些执行无需用户干预而且很费时的任务很适合在后台运行,如编译、压缩解压等任务。$./a.out&[1]1315jobidpid被挂起或在后台运行的进程,也称为作业(job)

进程管理jobs:查看作业状态,当前进程用+号表示,而前一个进程用-号表示。当有多个被挂起的进程,不带参数时,fg命令会把当前进程带到前台,而bg命令把当前进程恢复到后台运行。语法:fg[%jobid]作用:恢复作业号为jobid的前台进程的执行或把它从后台转移到前台执行。进程管理提供各种服务的后台进程称为守护进程,也称为精灵进程(daemon),如提供http服务的httpd进程。Kill杀死一个进程,killpid一个用户可以杀死自己的进程,但不能杀死别人的进程.root可以杀死任何进程终止后台进程有两种方法:1.killpid2.用fg命令把它转移到前台,然后按Ctrl+C系统调用系统调用的概念

系统调用(systemcall),顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。(❤更加底层,缓冲)进程相关的系统调用进程的创建:fork格式:pid=fork()此系统调用生成一个子进程,该子进程继承了父进程fork()之后的代码(其实质是继承了父进程的IP寄存器的内容),fork返回给子进程0值,返回给父进程为子进程的进程号(大于0),故可通过fork的返回值区分父子进程。fork之后父子进程并发执行。fork示例#include<stdio.h>main(){intpid;

/*此时仅有一个进程*/

printf(“PIDbeforefork():%d\n”,(int)getpid());

pid=fork();

/*此时已经有两个进程在同时运行*/

if(pid<0)printf("errorinfork!"); elseif(pid==0) printf("Iamthechildprocess,myprocessIDis%d\n",getpid()); else printf("Iamtheparentprocess,myprocessIDis%d\n",getpid());printf(“helloworld.\n”);}

(❤必考)fork示例编译并运行这个程序:$gcc-ofork_testfork_test.c$./fork_test

PIDbeforefork():1991Iamtheparentprocess,myprocessIDis1991Iamthechildprocess,myprocessIDis1992

helloworld.hellowold.再运行一遍,输出结果可能不同。读者考虑一下为什么?进程相关的系统调用exec我们经常需要父子进程执行不同的任务,仅用fork系统调用是不够的。exec可指定一个可执行程序的副本将调用进程的正文段和数据段进行覆盖,从而使子进程执行与父进程不同的程序代码。exec有六种使用方式,常用的有execl,execv。shell执行一个外部命令时就是通过创建一个子进程并让子进程执行命令。execl:表示指令用长格式调用execv:可利用参数argv指针数组运行参数execl示例

#include<stdio.h>main(){printf(“one\n”);execl(“/bin/ls”,”ls”,”-l”,NULL);printf(“two\n”);perror(“execerror”);return0;}

(❤必考)execv示例

#include<stdio.h>intmain(intargc,char*argv[]){printf(“one\n”);execv(“pathname”,argv[0],argv[1],NULL);printf(“two\n”);perror(“execerror”);return0;}

进程相关的系统调用exit进程可通过系统调用exit终止自己的运行(自杀),使进程处于僵尸状态。进程在自杀的时候可以留下遗言。这时被终止的进程会释放他所占有的资源,如关闭打开的文件,释放进程上下文占有的内存等并把其所有的子进程托付给init进程。处于僵死的进程只留下一个残骸(PCB),等待父进程为其处理后事。格式:exit(status)其中status是一个整数,它可以作为进程消亡时的留言状态传递给父进程。exit和return的区别系统调用exit和函数return执行效果相似,但运行机制是不相同的。return是函数结束的返回,它可以把一些值返回给调用函数,而且调用函数和被调用函数也可能很大,但它们可以是在一个进程中执行的程序。而系统调用exit是进程的终止,它所完成的是将子进程的返回状态传递给父进程,因此它们是两个层面上的概念,在使用中应加以区分。

进程相关的系统调用wait进程可以通过wait与正在执行的子进程终止点同步pid=wait(stat-addr)返回值pid是终止进程的进程号,参数stat-addr是子进程结束时返回的状态信息存放的地址。假设我们只对进程的同步感兴趣,而对进程返回的状态及终止进程的pid不感兴趣的话,可以简写成wait(0).例8.3进程的系统调用Fork()-父亲克隆一个儿子。执行fork()之后,兵分两路,两个进程并发执行。Exec()-新进程脱胎换骨,离家独立,开始了独立工作的职业生涯。Wait()-等待不仅仅是阻塞自己,还准备对僵死的子进程进行善后处理。Exit()-终止进程,把进程的状态置为“僵死”,并把其所有的子进程都托付给init进程,最后调用schedule()函数,选择一个新的进程运行。进程的一生随着一句fork,一个新进程呱呱落地,但这时它只是老进程的一个克隆。然后,随着exec,新进程脱胎换骨,离家独立,开始了独立工作的职业生涯。人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个"}",从容地离我们而去;也可以是中途退场,退场有2种方式,一种是调用exit函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下留言,放在返回值里保留下来;甚至它还可能被谋杀,被其它进程通过另外一些方式结束它的生命。进程死掉以后,会留下一个空壳,wait站好最后一班岗,打扫战场,使其最终归于无形。这就是进程完整的一生。文件描述符每个进程可以打开多个文件,每个进程用一个小的非负整数来表示其打开的每个文件,这个整数就是文件描述符(fd)。任何时候对文件的输入/输出都是通过文件描述符标示文件。文件描述符类似于标准库中的文件指针或MS-DOS中的文件句柄。因为大多数的输入/输出都是通过键盘和显示器来实现的,为了方便起见,当shell运行一个程序的时候,它将自动打开三个文件,对应的文件描述符分别为0、1、2,一次表示标准输入、标准输出和标准错误。文件相关的系统调用creat创建一个空文件,格式:fd=creat(name,Pmode),例如:fd=creat(“/usr/abc”,0777)每个进程有一个掩码umask,被创建文件的权限为(~umask)&Pmode

umaskisabuiltincommand.link用于建立文件之间的硬链接,格式:status=link(name1,name2)unlink

删除一个链接文件status=unlink(name)文件的打开和关闭open打开一个已存在的文件,格式:fd=open(name,rwmode[,pmode]);rwmode为文件被打开的模式。该函数正常调用返回的fd大于等于3close

关闭一个被打开的文件,格式:status=close(fd);read/write对文件的读写,格式:n=read(fd,buffer,size);n=write(fd,buffer,size);buffer是指向读/写缓冲区的指针,n是一次读/写操作的返回字节数文件的读写main(intargc,char*argv[]){intfd1,fd2,n;charbuf[512];if(argc<=2){printf("youforgottheenterafilename\n");exit(1);}fd1=open(argv[1],0);fd2=creat(argv[2],0644);while((n=read(fd1,buf,512))>0)write(fd2,buf,n);close(fd1);close(fd2);}拷贝的实现lseek(❤必考)改变文件指针所指的位置,格式:newpos=lseek(fd,offset,origin);tell捕获当前文件指针的位置,格式:Pos=tell(fd);Linux中把tell的功能加进lseek中,取消了telllockf:对文件记录锁定,格式:status=lockf(fd,func,size)文件的读写#include<sys/types.h>#include<unistd.h>#include<sys/stat.h>#include<fcntl.h>charbuf1[]="abcdefghij";charbuf2[]="ABCDEFGHIJ";main(){intfd;fd=creat("file.hole",777);write(fd,buf1,10);lseek(fd,40,SEEK_SET);write(fd,buf2,10);exit(0);}

(❤考类似)例7.3创建一个空洞文件dup(fd)(❤必考)复制文件描述符fd至最小未使用的文件描述符main(){intfd=creat(“outfile”,0644);close(1);dup(fd);close(fd);execl(“/bin/ls”,”ls”,”-l”,0);}系统调用dupstat(❤相当于ls的功能)系统调用stat以文件名作为参数,返回文件的i结点中的所有信息;若出错,则返回-1.如下所示:intstat(char*name,structstat*stbuf)它用文件name的i结点信息填充结构stbuf。头文件<sys/stat.h>中包含了描述stat的返回值的结构。如下:系统调用statstructstat{/*由stat返回的i结点信息*/dev_tst_dev;/*i结点设备*/ino_tst_ino;/*i结点编号*/shortst_mode;/*模式位*/shortst_nlink;/*文件的总链接数*/shortst_uid;/*所有者的用户id*/shortst_gid;/*所有者的组id*/dev_tst_rdev;/*用于特殊文件*/off_tst_size;/*用字符数表示的文件长度*/

time_tst_atime;/*上一次访问的时间*/time_tst_mtime;/*上一次修改的时间*/time_tst_ctime;/*上一次改变i结点的时间*/};系统调用statst_mode项包含了描述文件的一系列标志,这些在<sys/stat.h>中定义。文件类型的有关部分为:#defineS_IFMT0160000/*文件的类型*/#defineS_IFDIR0040000/*目录*/#defineS_IFCHR0020000/*特殊字符*/#defineS_IFBLK0060000/*特殊块*/#defineS_IFREG0100000/*普通*/系统调用stat#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>intmain(intargc,char**argv){structstatstbuf;stat(argv[1],&stbuf);printf("%s%8ld",argv[1],stbuf.st_size);if((stbuf.st_mode&S_IFMT)==S_IFDIR)printf("thisisadirectory.\n");if((stbuf.st_mode&S_IFMT)==S_IFREG)printf("thisisaregularfile.\n");return0;}系统调用stat

UNIX文件系统是UNIX成功的关键。其特点主要表现为以下几点:

目录结构采用树形层次结构可安装拆卸的文件系统文件是无结构的字符流式文件把外部设备和文件目录作为文件处理。UNIX文件系统特点lseek改变文件指针所指的位置,格式:newpos=lseek(fd,offset,origin);(❤必考)文件的随机存取这6个系统调用(creat,open,read,write,lseek,close)通常称为unbufferedI/O(相对于标准I/O库stdio.h中提供的函数).不同于这些系统调用操作的是文件描述符,标准I/O库中采用流(stream)的概念.当我们打开一个流,fopen返回指向文件对象(FILE)的指针.这个文件对象包含了标准I/O库用于管理流的所有信息:用于实际I/O的文件描述符;一个指向缓冲区的指针;缓冲区的大小,等等.FILE结构的定义可见stdio.h.

一个分区创建一个文件系统。Unix的文件系统通常由4部分构成:引导块超级块索引节点表数据区引导块(bootblock):处于文件系统的开始部分(0#块),其中存放操作系统的引导信息或系统启动代码。显然在操作系统管理的多个文件系统中,只有具有引导能力的文件系统的引导块中装有代码,其余文件系统此块均为空。超级块(superblock):此块(1#块)中存放文件系统中的文件和目录在磁盘上静态分布的描述信息,超级块对文件系统的维护很重要。索引节点表(inodelist):见下一页数据区(dataarea):存放本文件系统中文件数据和目录文件数据。文件系统中的文件有一些属性信息,比如创建时间、修改时间、文件大小、访问权限等。为了便于管理,Unix将每个文件的这些信息存放在其对应的索引节点(inode)中,每个文件唯一对应一个索引节点。索引节点是Unix中一个很重要的概念。索引节点也称i节点.每个索引节点在索引节点表中有一个编号,称为索引节点号。ls命令的i选项可以查看文件的索引节点号。目录(directory)的实现目录是一种特殊的文件。目录的功能是实现文件名到文件地址的映射。目录中的一项称为目录项(dentry,directoryentry)。所以,文件名和地址这两项在目录中是必不可少的。而文件的其他属性是否放到目录中,不同的操作系统有不同的做法。

下图是一个MS-DOS的目录项,它总共32个字节。目录文件名8扩展名31102224属性保留时间日期第一块号长度目录的实现UNIX中采用的目录结构非常简单,如图,每个目录项占16个字节,其中只包含文件名及其索引节点号。有关文件类型、长度、时间、所有者和磁盘地址等信息都放到索引节点(inode,indexnode)中,inode的引入为文件共享提供了便利。

目录索引节点号索引节点hello.c的内容目录项磁盘驱动器文件名142拥有者、创建时间、修改时间、访问权限,链接数等属性磁盘地址注意:目录也是一个文件,可以像普通文件一样通过less命令查看Unix采用inode的好处?(❤必考)优点1.加快检索文件的速度存取文件信息时要检索文件目录。如果把有关文件的全部说明信息都存放在相应的目录项中,势必使每个目录的规模庞大,而在进行检索时,又要把目录的全部内容都读入内存查找,这显然浪费了大量的I/O传送时间。

Unix的目录项只包含文件名和对应的inode编号,这样大大减少了系统各级目录的规模。

Unix采用inode的好处?优点2.采用inode为文件共享提供了便利由于Unix系统把文件名和文件的其他信息分开存放:文件名字存放在目录项中,而文件的其他信息存放在索引节点中,这样为多个逻辑文件名共享同一个物理文件提供了便利。

链接的目的是为了文件共享。可以用链接命令ln(Link)对一个已存在的文件再建立一个新的链接,而不复制文件的内容硬链接(hardlink):让一个文件对应一个或多个文件名,或者说把我们使用的文件名和文件系统使用的节点号链接起来,这些文件名可以在同一目录或不同目录软链接(也叫符号链接,symboliclink):是一种特殊的文件,这种文件包含了另一个文件的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论