资源描述
单击以编辑,母版标题样式,单击以编辑母版文本样式,第二级,第三级,第四级,第,4,章 第,*,页,第,4,章,UNIX,的文件和目录,本章主要内容,文件和目录的层次结构,命名规则,文件通配符,文件管理,目录管理,文件的归档与压缩处理,文件系统的存储结构,硬连接和符号连接,系统调用,文件和目录的访问,文件和目录的权限,2,4.1,文件和目录的层次结构,3,文件和目录的布局,(1),/etc,目录,供系统维护管理用的命令和配置文件,passwd,,,hosts,文件,issue,文件:登录前在,login,之上的提示信息,motd,文件:登录成功后的显示信息,rc.d,目录:开机自动执行的命令集合,又分成,0,1,2,.,9,十个阶段,分别对应,10,个目录,系统维护命令:,fsck,,,mount,,,shutdown,4,文件和目录的布局,(2),/,tmp,存放临时文件,/bin,系统常用命令,如,ls,,,ln,,,cp,,,cat,等,/dev,存放设备文件,如终端设备,磁带机,打印机等,/,usr,/include,C,语言头文件存放目录,/,usr/tmp,存放临时文件,/,usr,/bin,存放一些常用命令,如,ftp,,,make,等,5,文件和目录的布局,(3),/lib,/,usr,/lib,存放各种库文件,指,C,语言的链接库文件,以及,terminfo,终端库等等,静态链接库文件有,.a,后缀,(,archive,存档,),动态链接库文件后缀是,.,so,(shared,objects),UNIX,广泛使用动态链接库,静态链接库逐渐过时,/,usr,/spool,存放与用户有关的一些临时性文件,如:打印队列,已收到但未读的邮件等等,6,4.2,文件和目录命名规则,7,文件和目录的命名规则,名字长度,允许,1,255,字符,有些,UNIX,不支持长文件名,但至少长度为,1-14,取名的合法字符,除斜线外的所有字符都是命名的合法字符,不可打印字符也可以做文件名,(,除了字节,0,),斜线留做路径名分割符,大小写字母有区别,8,4.3,shell的文件通配符,处理,文件通配符规则(,1,),星号,*,匹配任意长度的文件名字符串,(,包括空字符串,),点字符,(.),,当它作为文件名或路径名分量的第一个字符时,必须显式匹配,斜线,(/),也必须显式匹配,例:,*,file,匹配,file,,,makefile,,不匹配,.profile,文件,try*c,匹配,try1.c,try.c,try.basic,10,文件通配符规则(,2,),问号,?,匹配任一单字符,方括号,匹配括号内任一字符,也可以用减号指定一个范围,例,:,A-Z*.,ch,Mmakefile,注意,文件名通配符规则与正则表达式的规则不同,应用场合不同,不同种类,shell,通配符,规则会略有些差别,11,与,DOS,文件通配符的区别,(1),例,1,:,UNIX,文件通配符比,DOS,严谨,无二义性,设当前目录下有,xcom.exe,xcom.c,xcom.obj,DOS,中,DIR XCOM*,会列出三个文件,DEL XCOM*,删不掉上述任何文件,UNIX,不存在二义性解释,ls,xcom,*,会列出三个文件,rm,xcom,*,会删除三个文件,例,2:DOS,中*,.*,匹配所有文件,UNIX,中*,.*,要求文件名中必须含有圆点,否则不匹配,如:*,.*,与,makefile,不匹配,12,与,DOS,文件通配符的区别,(2),例,3,:在,DOS,中,无法使用通配串*,temp*,在,UNIX,中对*,temp*,严格按前述规则去理解,而且*,temp*list*,也可用,例,4,:子目录名的匹配,在,UNIX,中可以使用*,/*.,ch,通配符,,DOS,中不许,例,5,:,UNIX,中文件通配符适用所有命令,UNIX,中文件通配符允许用于任何命令,而,DOS,中只能用于,dir/del/copy,等有限的几个命令中,UNIX,中命令,cat*.c,可以列出所有的,.c,文件内容,,DOS,中命令,TYPE*.C,不可,13,shell,与,kernel,shell,shell,是一个用户态进程,对用户提供命令行界面,使用操作系统核心提供的功能,kernel,:操作系统核心,管理系统资源,(,包括内存,磁盘等,),运行在核心态,通过软中断方式对用户态进程提供系统调用接口,Kernel,shell,进程,操作员,命令行界面,系统调用接口,用户态,核心态,硬件资源,硬件接口,14,程序获取命令行参数的方式,从,main,的两个参数,可获得命令行参数的内容,演示程序,arg.c,void,main(int,argc,char*,argv,),int,i;,for(i=0;i /var/opt/K/SCO/Unix/5.0.5Eb/pmd/pmd,drwxrwxrwt,2 sys,sys,4096 Oct 18 10:48,tmp,lrwxrwxrwx,1 root sys 11 Jul 11 07:31,unix,-/stand/,unix,drwxrwxr-x,25 root auth 512 Oct 2 17:18,usr,drwxr-xr-x,6 root sys 512 Jul 11 07:43,var,crw-r-r,-1 bin,ter,0,9 Oct 18 09:56/dev/tty10,prw-r-r,-1 root sys 2642 Oct 18 11:07/,tmp,/pipe,25,cp:,拷贝文件,命令的两种格式和功能,cp,file1 file2,cp,file1 file2 .,filen,dir,其中,file1,,,,,filen,为,文件,名,,,dir,为,已有目录名,例,:,cp,a.c,a.bak,cp,a.c,b.c,backup.dir,例,:cp*.c,bak.d,与,DOS,命令,COPY*.C BAK.D,执行结果相同,过程不同,UNIX,中实际执行,cp a1.c a2.c b1.c b2.c,bak.d,26,cp:,拷贝文件,(,例,2),例,2:cp,bak.d/p,*.c,命令,实际执行,cp,bak.d/pl.c,bak.d/p2.c,结果文件,p1.c,将覆盖掉,p2.c,与,DOS,的,COPY BAK.D/P*.C,执行结果不同,将这两个文件拷贝到当前目录下的正确用法:,cp,bak.d/p,*.c .,27,mv,:,移动文件,格式,1,mv,file1 file2,mv,file1 file2.,filen,dir,mv,dir1 dir2,功能,使用,mv,命令,可以将文件和目录改名,可以,将文件和子目录,从一个目录移动到另一个目录,28,rm,:,删除文件,命令格式,rm,file1 file2 .,filen,例,rm,core,a.out,rm,*.o*.,tmp,rm,*.,bak,选项,-r,递归地,(,R,ecursive,),删除,实参表中的目录,也就是删除一整棵目录树。,-i,每删除一个文件前需要操作员确认,(Inform),-f,强迫删除,(Force),。,只读文件也被删除并且无提示,其它问题,正在运行的可执行程序文件不能被删除,29,显式地区分命令选项和处理对象,问题,设当前,目录下只有,a,,,b,,,c,三个文件,rm,-i,who-i,rm,-i,rm,*,cat*,ls,*,解决方法,许多,UNIX,命令,(,如,cp,,,ls,,,mv,,,rm,,,cat,,,grep,,,set,等,),用,-,显,式地标志命令行选项的结束,识别,以,-,开头,的处理对象。如,:,rm,-i,(,删除文件,-i),只提供选项,未指定任何文件,命令格式错,生成文件,-i,(,符合文件的命名规则,),不能删除文件,-i,rm,-i a b c,cat-i a b c,ls,-i a b c,30,4.,5,目录管理,31,路径名,绝对路径名与相对路径名,路径分量分隔符用,斜线,/,,而不是反斜线,例如,/,usr/stud/liu,test/data1/cfg,当前工作目录,当前工作目录是进程属性的一部分,每进程一个,没有逻辑盘的概念,文件,.,与,.,在目录表中确实有两个文件,这两个目录项由系统创建和删除,主目录,(Home Directory),每个用户都有自己独立的主目录,用,env,命令查环境变量,HOME,的,值,32,打印,/,改变当前目录,pwd,命令:打印当前工作目录,print working directory,cd,命令:,改变当前工作目录,(Change Directory),cd,/,usr,/include,cd,/,斜线前必须有空格,cd,.,cd,命令无实参,在,DOS,中,打印当前工作目录,在,UNIX,中,,回到,用户的,主目录,(Home Directory),注意,cd,是,shell,的一个,内部命令,33,创建,/,删除目录,创建目录,mkdir,例:,mkdir,sun/,work.d,mkdir,除创建目录外,系统自动建立文件,.,与,.,删除目录,rmdir,例:,rmdir,sun/,work.d,要求被删除的目录除,.,与,.,外无其它文件或目录,其他命令:,rm,-r sun/,work.d,34,cp:,复,制目录,cp,命令选项,r,,,递归地复制一个目录,cp-r,dir1,dir2,若,dir2,不存在,则新建子目录,并将,dir1,下内容拷入,若,dir2,已存在,则将所有文件拷入目录,dir2,选项,v,,,冗长,(verbose),方式,复制时列出所拷贝的文件名,选项,u,,增量,拷贝,(update),,,便于备份目录,根据文件的时戳,不拷贝相同的或者过时的版本的文件,以提高速度,dir1,和,dir2,不慎颠倒位置,不会出现灾难性后果,DOS,中,类似,功能的,命令,XCOPY,,选项,/D,可以,用来实现增量,拷贝,(Date),35,cp:,复制目录,(,举例,),复制,目录,将目录,work.d,复制为,bak.d,cp-r,work.d,bak.d,增量拷贝,将,work.d,中的内容增量拷贝到备份目录,bak.d,中,cp-,ruv,work.d,bak.d,命令,touch,将文件的最后一次修改时间设置为当前时间,但不修改文件内容。例如:,touch*.,ch,36,find:,在目录中查找文件,功能,f,ind,命令从指定的,查找范围,开始,递归地查找子目录,凡满足,条件,的文件或目录,执行规定的,动作,举例,find,verl.d,ver2.d-name*.c-print,查找范围:当前目录的子目录,ver1.d,和,ver2.d,条件:与名字*,.c,匹配。注,:*.c,应当用引号括起,动作:把查找到的文件的路径名打印出来,命令的特点,功能强,选项较多,递归式查找,提供了一种遍历目录树的手段,其它命令经常借用,find,的,“,递归式查找”,特性,37,find,关于条件的选项,(1),-name,wildcard,文件名匹配,允许使用文件通配符,(,注意必需的引号,),-type,f,:,普通文件,d,:,目录,l,:,符号连接文件,c,:,字符设备文件,b,:,块设备文件,p,:,管道文件,-,inum,i-node-number,指定,i,节点号,-size,nbytes,c,指定文件字节数,-size,nblocks,指定磁盘存储块数,-,mtime,ndays,文件最近修改时间,-,atime,ndays,最近访问,(,读,/,执行,),时间,38,find,关于条件的选项,(2),其它条件选项,可指定文件主,-user,,,-,nouser,可指定用户组,-group,,,-,nogroup,指定,link,数,-links,指定路径深度,-depth,指定文件的访问权限,-perm,复合条件,可以用,!()-o,等,表示多条件,的与,/,或,/,非,39,find,关于动作的选项,-print,打印查找的文件的路径名,-exec,对查找到的目标执行某一命令,在,-exec,及随后的分号之间的内容作为一条命令,,代表所查到的路径名,-ok,与,-exec,类似,只是对查找到符合条件的目标执行一个命令前需要经过确认,40,find,使用举例,(1),find.-type d-print,从当前目录开始查找,寻找所有目录,打印路径名,按层次列出当前的目录结构,find/-name stud*-type d-print,指定了两个条件:名字与,stud*,匹配,类型为目录,两个,条件逻辑“与”,,必须同时符合这两个条件,find/-type f-,mtime,-10-print,从根目录开始检索最近,10,天之内曾经修改过的普通磁盘文件,41,find,使用举例,(2),find.-,atime,+30-,mtime,+30-print,从当前目录开始检索最近,30,天之内既没有读过,也没有写过,而且也没有被当作命令执行过的文件,筛选出一个时间周期内不活跃的文件,find .!-type d-links+2-print,从当前目录开始检索,link,数大于,2,的非目录文件,条件“非”,用!,注意:,!,号与,-type,之间必须保留一空格,42,find,使用举例,(3),find/-size+100000c(-name core-o -name*.,tmp,)-print,寻找,大于,100K,的名,叫,core,或有,.,tmp,后缀,使用了两,条件“或”,(-,o,),及组合,(,圆括号,),不要遗漏了所必需的引号,反斜线和空格,尤其是圆括号前和圆括号后。圆括号,是,shell,的,特殊字符,其他写法,find/-size+100000c(-name core-o-name*.,tmp,)-print,find/-size+100000c (-name core o-name*.,tmp,)-print,43,find,使用举例,(4),find/-name make-print-exec,ls,-l ;,-exec,及随后的分号之间的内容作为一条命令执行,shell,中分号有特殊含义,前面加反斜线,代表所查到的符合条件的路径名。注意,两花括号间无空格,之后的空格不可省略,-ok,选项在执行指定的命令前等待用户确认,find/-size+100000c(-name core-o name*.,tmp,)-ok,rm,;,44,find,使用举例,(5),利用,find,的递归式遍历目录的功能,find,src,-name*.c-exec,grep,-help /dev/null;,在目录,src,中所有,.c,文件中查找,-help,字符串,将当前目录下所有文件拷贝到目录,./,bak,中去,执行,cp*./,bak,命令:如果当前目录下文件太多,shell,扩展*时失败,从而不能执行期望的功能,用,find,命令与,cp,命令配合工作,find.-type f-,maxdepth,1-exec cp ./,bak,;,选项,-,maxdepth,1,将,find,的搜索深度限制为最多,1,层,如果当前目录有子目录,就不再检索子目录,45,4.6,文件的归档与压缩处理,46,tar:,文件归档,(1),功能,tar,命令最早为顺序访问的磁带机设备而设计的,(Tape,ARchive,,磁带归档,),,,用于保留和恢复磁带上的文件,命令用法,tar,ctxu,v,f,device,file-list,选项第一字母指定要执行的操作,是必需的,c,:,Create,创建新磁带。从磁带的头上开始写,以前存于磁带上的数据会被覆盖掉,t,:,Table,列表。磁带上的,文件名列表,当不指定文件名时,将列出所有的文件,47,tar:,文件归档,(2),x,:,eXtract,抽取。从,磁带中抽取指定的文件。当不指定文件名时,抽取所有文件。如果磁带上有多个同名文件时,最后一个文件将覆盖所有较早同名文件,u,:,Update,更新。把文件,追加到磁带尾部,这个文件的某个版本可能已经存放到磁带上。为了兼顾磁带顺序访问特点,新版本文件追加到文件尾部,旧版本文件仍保留,除功能字母外的其它选项,v,:,Verbose,冗长,。,tar,每处理一个文件,就打印出文件的文件名,并在该名前冠以功能字母,f,:,File,指定设备文件名,j,:,Linux,中的选项,,文件采用压缩格式,48,tar,命令使用举例,(1),tar,cvf,/dev/rct0.,将整棵当前目录树,备份,到设备,/dev/rct0,中,圆点,目录是当前目录,tar,xvf,/dev/rct0,将,磁带设备,/dev/rct0,上的数据恢复,到文件系统中,tar,tvf,/dev/rct0,打印磁带,设备,/dev/rct0,上的文件目录,tar,uf,/dev/rct0,test.c,磁带备份完成,之后,文件,test.c,又发生了变化,将更新过的,test.c,追加到磁带,尾部,49,tar,命令使用举例,(2),tar,cvf,my.tar,*.,ch,makefile,指定普通文件代替设备文件,将多个文件或目录树存储成一个文件。这是早期的文件和目录打包工具,这一命令危险的误操作是:,tar,cvf,*.,ch,makefile,漏掉了必需的“设备文件名”,按照,shell,对文件名的展开规则,可能会冲掉现存的某一文件,tar,cvf,a1.c a2.c,ab.h,makefile,50,tar,命令使用举例,(3),目录打包,设,work1,是一个复杂的有多个层次的子目录,tar,cvf,work1.tar work1,从归档文件中恢复数据的命令:,tar,xvf,work1.tar,51,文,件压缩和解压缩,命令,compress,和,uncompress,采用,LZW,算法对文件压缩,是一种字典压缩算法,压缩算法对文件中有规律的数据内容压缩效率很高,普通文本文件可压掉,50-80%,有许多空白字段的数据库文件甚至可压掉,90%,以上,压缩完的文件名后缀是,.Z,举例,compress ch5,压缩,生成新文件,ch5.Z,zcat,ch5.Z,读取压缩格式的文件,uncompress,ch.Z,解压缩,还原文件,ch5,Linux,的文件压缩,/,解压缩工具,gzip/gunzip,52,文件归档与压缩的应用,通用性,文件归档,tar,与压缩处理,compress,在,不同,UNIX,系统间有通用性。可以用来在不同,UNIX,中交换,程序或数据,举例:在两台主机之间拷贝一棵目录树,在主机,A,tar,cvf,abc.tar,abc,将目录,abc,存到文件,abc.tar,compress,abc.tar,压缩生成文件,abc.tar.Z,(惯例:后缀为,.,tar.Z,的文件),将文件,abc.tar.Z,通过网络传到主机,B,主机,B,uncompress,abc.tar.Z,tar,xvf,abc.tar,53,4.,7,文件系统的存储结构,54,根文件系统与子文件系统,根文件系统,(root,filesystem,),根文件系统是整个文件系统的基础,,不能“脱卸,(,umount,)”,子文件系统,子文件系统,包括,硬盘,软盘,,CD-ROM,,,USB,盘,网络文件系统,NFS,,都以根文件系统中某一子目录的身份出现,不象,DOS,那样,使用逻辑盘的概念,独立的存储结构,根文件系统和子文件系统都有其自己独立的文件系统存储结构,甚至文件系统的格式也可以不同,55,文件系统,:,创建和安装,(1),(SCO UNIX,系统中的命令,),mkfs,/dev/fd0,创建,文件系统,(make,filesystem,),。块设备,文件,/dev/fd0,指,A,盘,安装子文件系统,mount,mount/dev/fd0/,mnt,/,mnt,可以是任一个事先建好的空目录名,允许处于根文件系统的任何目录中,此后,操作子目录,/,mnt,就是对子文件系统的访问。对于应用程序来说,从所操作的文件或目录名,看不出和其它根文件系统的对象有什么区别,56,文件系统,:,创建和安装,(2),访问,/,mnt,子目录实际上操作子文件系统,cp/,usr,/include/*.h/,mnt,rm,/,mnt/stdio.h,mkdir,/,mnt/jiang,cp/,usr/jiang,/*.,ch,/,mnt/jiang,vi/,mnt/jiang/fn.c,ls,/,mnt,不带参数的,mount,命令,列出当前已安装的所有的子文件系统,umount,命令,功能与,mount,命令相反,拆除一个已安装的子文件系统。例如:,umount,/dev/fd0,57,df,:,文件系统空闲空间,-v,列出文件存储区总长度,空闲空间和百分比,-i,列出,i,节点使用情况,$,df,/(/dev/root ):710734 blocks 150779 i-nodes,/stand (/dev/boot ):14556 blocks 3824 i-nodes,$,df,-v,Mount Dir,Filesystem,blocks used free%used,/dev/root 1612078 901344 710734 56%,/stand /dev/boot 30720 16164 14556 53%,$,df,-i,Mount Dir,Filesystem,iused,ifree,itotal,%,iused,/dev/root 50733 150779 201512 26%,/stand /dev/boot 16 3824 3840 1%,$,df,-vi,Mount Dir,Filesystem,blocks used free%used,iused,ifree,%,iused,/dev/root 1612078 901344 710734 56%50733 150779 26%,/stand /dev/boot 30720 16164 14556 53%16 3824 1%,58,文件系统的结构,(1),把整个逻辑设备以,512,字节为块,(,扇区,),划分,编号为,0,,,1,,,2,,,.,。,引导块,(0,号块,),用于启动系统,只有根文件系统的引导块有效,专用块,(1,号块,),:,也叫管理块,或者超级块,存放与整个文件系统的管理有关的信息。如:文件系统的大小,,i,节点区的大小,空闲空间大小,空闲块链表的头等等,59,文件系统的结构,(2),i,节点区,i,节点,(index node,,简记为,i-node),i,节点区由若干块构成,在文件系统创建时确定,每磁盘块可容多个,i,节点,每个,i,节点为,64,字节,i,节点编号:从,1,开始。,1,,,2,,,3,,,.,每个文件都对应一个,i,节点,每个,i,节点中的数据,指向文件存储区数据块的一些索引指针,文件类型,属主,组,权限,,link,数,大小,时戳,i,节点内不含文件名,文件存储区,用于存放文件数据的区域,包括目录表,60,目录存储结构,树形带交叉勾连的目录结构,目录表,每个目录表也作为一个文件,存于,“文件存储区”,中,有其自己的,i,节点,目录表由,一个个“目录项”构成,每个目录项,由“文件名,-i,节点号”对构成,用,ls,命令列出的目录大小是目录表本身的长度,61,目录存储结构示意图,62,目录表和,i,节点两级结构,(1),主要目的,分开存放的主要目的是为了提高目录检索效率,假定的环境,存储文件名使用定长,14,字节,索引信息需要,64,字节,每磁盘块,512,字节,当前目录下有,100,个文件,需要访问的文件的文件名,mydata.bin,存放在目录表的最末尾处,方案一:一级结构,文件名和索引信息存放在一起,放在目录表中,每个目录项,78,字节,每块可容纳,51278=6,个目录项,读入目录直到第,17,块才找到,mydata.bin,以及索引信息,63,目录表和,i,节点两级结构,(2),方案二:两级结构,文件名和索引信息分开,索引信息存放在,i,节点中,目录表中仅记录文件名和,i,节点的,2,字节编号,每个目录项,16,字节,一个磁盘块含,51216=32,个目录项,读入,4,块就检索到名字,mydata.bin,的,i,节点号,根据,i,节点号读取,i,节点,读入,i,节点区的一个磁盘块,总共磁盘操作,5,块,就可以根据名字找到文件的索引信息,两种方案的比较,后者需要更少的磁盘访问次数,文件系统采用这样的存储结构,完全可以在同一目录或者不同目录中的两个目录项,有相同的,i,节点号,64,4.8,硬连接和符号连接,65,硬连接,目录表由目录项构成,目录项是,一个“文件名,-i,节点号”,对,根据文件系统的存储结构,完全可以在同一目录或者不同目录中的两个目录项,有相同的,i,节点号,每个目录项指定的文件名,-i,节点号映射关系,叫做硬连接,硬连接数目,(link,数,),:同,一,i,节点被目录项引用的次数,66,ln,:,普通文件的硬连接,$,ln,chapt0 intro,$,ls,-l chapt0 intro,-,rw-rw-rw,-2,kc,kermit,17935 Dec 12 18:07 chapt0,-,rw-rw-rw,-2,kc,kermit,17935 Dec 12 18:07 intro,(,前面的几项必相同,为什么?,),$,ls,-i chapt0 intro,13210 chapt0,13210 intro,chapt0,与,intro,同时存在时,地位完全平等,删,chapt0,文件,则,intro,仍存在但,link,数减,1,硬连接,只限于同一文件系统中的普通文件,67,目录表的硬连接,不允许对目录用,ln,命令建立硬连接,一般来说,目录的,link,数,=,直属子目录数,+2,68,目录表的硬连接示意图,69,符号连接,符号连接也叫软连接,用特殊文件,“,符号连接文件,”,来实现,文件中仅包括了一个路径名,命令,ln,-s,和,ls,-l,ln,-s,users_on,sym.link,ls,-l,sym.link,l,rwxrwxrwx,1 guest other 8 Jul 26 16:57,sym.link,-,users_on,类型为,l,,大小为,8,字节,文件,中只存放,users_on,字符串,文件的最后一次写时间以后不再变化,一旦建立了符号连接,删除操作删除的是符号连接文件,其它所有操作都将访问符号连接所引用的文件,70,符号连接的实现,71,符号连接的规则,系统处理路径名分量时发现符号连接,就把符号连接内容加到路径名的剩余部分的前面产生结果路径名,若符号连接包含绝对路径名,使用绝对路径名,否则,根据在文件层次中该连接的相对位置,计算符号连接内容,(,不是根据调用进程的当前的工作目录,),设当前目录为,d,ln,-s d1/dlb d1/dx,在,d1,下新建文件,dx,访问,d1/dx,实际访问,d1/d1/d1b,72,硬连接与符号连接的比较,硬连接,在数据结构层次上实现,只适用于文件,不适用于目录,不同文件系统之间也不行,硬连接能够完成的功能软连接可以做到,符号连接,在算法软件上实现,硬连接能够完成的功能软连接可以做到,适用于目录,也适用于不同的文件系统,但同硬连接相比要占用操作系统内核的一部分开销,循环式符号连接,以及处理方法,73,4.9,系统调用,74,系统调用,(System call),系统调用的基本概念,是操作系统的内核提供的编程界面,是应用程序和操作系统进行交互的唯一手段,例如:文件操作的,open,,,read,,,write,,,close,和普通的库函数调用在执行方式上的区别,UNIX,第,7,版,50,多个,,SVR4,扩充到,120,个,调用函数的名字,参数排列顺序,参数的类型定义,返回值的类型,以及实现的功能,都属于,POSIX,标准来规范的内容,75,系统调用返回值,返回值,UNIX,的系统调用一般都返回一个整数值,返回值大于或等于零:成功,返回值为,-1,:失败,整型变量,errno,标准库为,errno,保留存储空间,系统调用失败后填写错误代码,记录了失败原因,#include,之后,就可以直接使用,errno,errno.h,头文件定义了许多有,E,前缀的宏,例如,EACCESS,,,EIO,,,ENOMEM,,,EINTR,相关系统调用的手册页中有出错说明,76,strerror,与,perror,strerror,ch,ar*,strerror(int,errno,);,errno,便于程序识别错误原因,不便于操作员理解失败原因。库函数,strerror,将数字形式的错误代码,转换成一个可阅读的字符串,perror,void,perror(char,*,string,);,在标准错误输出上产生一消息,描述,errno,的错误,格式:先打印字符串,string,,再打印出一个冒号和空格,然后再打印出这条消息和换行符,77,4.10,文件和目录的访问,78,系统调用,stat/,fstat,从,i,节点获得文件的状态信息,stat,得到指定文件名的,i,节点,fstat,得到已打开文件的,i,节点,stat,和,fstat,将数据放入调用者提供的,stat,结构中,#,include,#include,int,stat(char,*path,struct,stat*,sbuf,);,/*return O on success or-1 on error*/,int,fstat(int,fd,struct,stat*,sbuf,);,/*returns O on success or-1 on error*/,79,数据结构,stat(1),struct,stat,dev_t,st_dev,;/,包含,i,节点的设备的设备号,ino_t,st_ino,;/i,节点号,mode_t,st_mode,;/,文件方式,总共,16,比特,nlink_t,st_nlink,;/link,数,(short,型,),uid_t,st_uid,;/,文件主,ID,gid_t,st_gid,;/,用户组,ID,dev_t,st_rdev,;/,设备文件的设备号,off_t,st_size,;/,文件大小(字节数),time_t,st_atime,;/,最近访问时间,time_t,st_mtime,;/,最近修改时间,time_t,st_ctime,;/,文件最近状态改变时间,;,80,数据结构,stat(2),st_mode,域:,16,比特,文件的基本存取,权限和,SUID/SGID,权限,(11,比特,),文件的类型,(,若干比特,),,判,st_mode,&S_IFMT,S_IFREG,普通磁盘文件,S_IFDIR,目录文件,S_IFCHR,字符设备文件,S_IFIFO,管道文件,S_IFLNK,符号连接文件,st_ctime,,,st_atime,,,st_mtime,域,“访问”:读,执行,“修改”:写,“改变”:写,,修改权限,/link,数,/,文件主等,i,节点信息,81,目录访问,可以象普通磁盘文件那样,打开目录读取,目录访问的库函数,#include,DIR*,opendir(char,*,dirname,);,struct,dirent,*,readdir(DIR,*,dir,);,int,closedir(DIR,*,dir,);,opendir,打开目录,得到句柄,(,NULL,表示失败),readdir,获取一个目录项:返回值指针指向的结构体记录,i,节点号和文件名,(,d_ino,和,d_name,成员,),。返回,NULL,,标志目录,表已经读到尾,不再使用的目录句柄,用,closedir,关闭,82,目录访问举例,myls.c(1),#include,#include,#include,int,main(int,argc,char*,argv,),DIR*,dir,;,struct,dirent,*entry;,if(,argc,!=2),fprintf(stderr,Usage:%s n,argv0);,exit(1);,dir=opendir(argv1);,if(dir=NULL),printf(Open,directory%s:%s(ERROR%,d)n,argv1,strerror(errno,),errno,);,return 1;,83,目录访问举例,myls.c(2),while(entry=,readdir(dir,)!=NULL),printf(%4d%s n,entry-,d_ino,entry-,d_name,);,closedir(dir,);,return 0;,$,./,myls,/etc,4110.,2 .,4111,consdef,4112,csh.cshrc,4113,csh.login,4114,dlpi.conf,4115,dumpdates,4116 environment,4117,filesystems,4118 group,.,84,上机习题,vi,编程,实现,UNIX,风格,程序,myrm.c,,实现与,rm,命令相同的功能。体会,UNIX,文件,通配符的处理方式,,UNIX,命令,对选项的处理方式。实现选项,i v r,以及,-,i,interactive,交互式,每次删除之前,确认,v,verbose,冗长方式,,每执行一次操作都打印出来,r,recursion,递归方式,删除子目录,-,显式的终止命令选项分析,举例:,./,myrm,ri,-i a*,85,上机习题,:,参考函数,#include,#include,#include,ret=,unlink(path,);/*,删除文件*,/,/*,获取路径名对应的,i,节点中的属性*,/,struct,stat,st,;,ret=,stat(path,&st,);,if(S_ISDIR(st.st_mode,)/*,判断,i,节点属性*,/,ret=,chdir,(.);/*,修改当前目录到上级目录*,/,ret=,rmdir(path,);/*,删除一个空目录*,/,86,4.11,文件和目录的权限,87,文件的权限,用于控制进程对系统中文件和目录的访问,权限的三个级别,文件主,同组用户,其他用户,每个文件有唯一的属主,普通文件的权限,读、写、可执行,不可写文件也可以被删除,88,两类可执行文件,程序文件,二进制的,CPU,指令集合,满足规定的格式,脚本文件:,ASCII,文件,默认的解释程序为,/bin/,sh,可以在文件的第一行自行指定解释程序,例如:,#!/bin/,csh,解释程序也可以是用户自己编写的应用程序,89,目录的权限,读权限,若无读权限,那么,“目录表”文件不许,读,,ls,会失败,写权限,若无写,权限,那么“目录表”文件,不许写,创建文件,删除文件,文件改名会修改目录文件,修改文件不需要修改目录文件,需要修改,i,节点,目录无写权限不是指目录下所有文件禁止写,执行权限,有执行权限意味着分析路径名过程中可检索该目录,cat/a/,b/c,要求,/,,,/a,,,/a/b,三目录有,x,权限,,c,文件有读权限;否则,命令执行失败,cd,./st8,要求当前目录,,.,和,st8,必须有,x,权限,90,权限验证的顺序,文件主与进程主相同,使用文件主权限,不再查组和其他用户的权限,文件主与进程主不同,但文件主与进程主同组,只使用组权限,不使用关于其他用户的权限,文件主与进程主不
展开阅读全文