实验八 文件管理实践.docx
- 文档编号:5439299
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:20
- 大小:30.90KB
实验八 文件管理实践.docx
《实验八 文件管理实践.docx》由会员分享,可在线阅读,更多相关《实验八 文件管理实践.docx(20页珍藏版)》请在冰豆网上搜索。
实验八文件管理实践
实验八文件管理实践
【实验目的】
配合操作系统课程的学习,加深对文件管理的理解。
【实验学时】
建议2学时
【实验内容】
1.掌握linux中文件的基本操作,了解带缓存与不带缓存文件IO函数,进行简单的文件IO程序编写。
2.生成基本的引导程序,加载入内存执行(选做)
3.生成简单的操作系统内核,加载入内存执行(选做)
【实验原理】
一、基本文件操作
(1)查看文件(可以是二进制的)内容cat
执行格式:
catfilename或morefilename或catfilename|more
例:
catfile1以连续显示方式,查看文件file1的内容
morefile1
或catfile1|more以分页方式查看文件的内容
(2)删除文件rm
执行格式:
rmfilename
例:
rmfile?
rmf*
(3)复制文件cp
执行格式:
cp[-r]sourcedestination
例:
cpfile1file2将file1复制成file2
cpfile1dir1将file1复制到目录dir1
cp/tmp/file1将file1复制到当前目录
cp/tmp/file1file2将file1复制到当前目录名为file2
cp–rdir1dir2(recursivecopy)复制整个目录。
(4)移动或更改文件、目录名称mv
执行格式:
mvsourcedestination
例:
mvfile1file2将文件file1,更名为file2
mvfile1dir1将文件file1,移到目录dir1下
mvdir1dir2
(5)比较文件(可以是二进制的)或目录的内容diff
执行格式:
diff[-r]name1name2(name1、name2同为文件或目录)
例:
difffile1file2比较file1与file2的不同处
diff-rdir1dir2比较dir1与dir2的不同处
(6)文件属性的设置chmod&umask
改变文件或目录的读、写、执行的允许权
执行格式:
chmod[-R]modename
其中:
[-R]为递归处理,将指定目录下所有文件及子目录一并处理
mode为3-8位数字,是文件/目录读、写、执行允许权的缩写(r:
read,数字代号为"4"w:
write,数字代号为"2"x:
execute,数字代号为"1")
mode:
rwxrwxrwx
usergroupother
缩写:
(u)(g)(o)
例:
chmod755dir1将目录dir1设定成任何人皆有读取及执行的权利,但只有拥有者可作写修改。
其中7=4+2+1,5=4+1
chmod700file1将file1设为拥有者可以读、写和执行
chmodo+xfile2将file2,增加拥有者可执行的权利
chmodg+xfile3将file3,增加组使用者可执行的权利
chmodo-rfile4将file4,除去其它使用者可读取的权利
umask命令设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。
对于文件来说,这一数字的最大值分别是6。
系统不允许在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。
目录则允许设置执行权限,这样针对目录来说,umask中各个数字最大可以到7。
执行格式:
umask[nnn]
用umask命令查看umask值
022
此时建立的文件默认权限是644(6-0,6-2,6-2),建立的目录的默认权限是755(7-0,7-2,7-2),
二、不带缓存的文件IO操作和带缓存的文件IO操作
Linux系统中,基于文件描述符的文件操作主要有:
不带缓存的文件I/O操作和带缓存的文件流I/O操作。
(1)不带缓存的文件I/O操作,又称系统调用I/O操作,符合POSIX标准,设计的程序能在兼容POSIX标准的系统间方便地移植。
指在用户层无缓存!
!
在内核层仍然用缓存!
!
要写入数据到文件上时(就是写入磁盘上),内核先将数据写入到内核中所设的缓冲储存器,假如这个缓冲储存器的长度是100个字节,调用系统函数:
ssize_twrite(intfd,constvoid*buf,size_tcount);
写操作时,设每次写入长度count=10个字节,那么要调用10次这个函数才能把这个缓冲区写满,此时数据还是在缓冲区,并没有写入到磁盘,缓冲区满时才进行实际上的IO操作,把数据写入到磁盘上。
无缓存IO操作数据流向路径:
数据——内核缓存区——磁盘
不带缓存的文件I/O操作用到的主要函数有:
intopen(constchar*path,intaccess,intmode)
path要打开的文件路径和名称
access访问模式,宏定义和含义如下:
O_RDONLY1只读打开
O_WRONLY2只写打开
O_RDWR4读写打开
还可选择以下模式与以上3种基本模式相与:
O_CREAT0x0100创建一个文件并打开
O_TRUNC0x0200打开一个已存在的文件并将文件长度设置为0,其他属性保持
O_EXCL0x0400未使用
O_APPEND0x0800追加打开文件
O_TEXT0x4000打开文本文件翻译CR-LF控制字符
O_BINARY0x8000打开二进制字符,不作CR-LF翻译
mode该参数仅在access=O_CREAT方式下使用,其取值如下:
S_IFMT0xF000文件类型掩码
S_IFDIR0x4000目录
S_IFIFO0x1000FIFO专用
S_IFCHR0x2000字符专用
S_IFBLK0x3000块专用
S_IFREG0x8000只为0x0000
S_IREAD0x0100可读
S_IWRITE0x0080可写
S_IEXEC0x0040可执行
(2)带缓存IO操作数据流向路径:
数据——流缓存区——内核缓存区——磁盘
带缓存IO也叫标准IO,符合ANSIC的标准IO处理,不依赖系统内核,所以移植性强,我们使用标准IO操作很多时候是为了减少对read()和write()的系统调用次数,带缓存IO其实就是在用户层再建立一个缓存区,这个缓存区的分配和优化长度等细节都是标准IO库处理好了,不用去操心,还是用上面那个例子说明这个操作过程:
要写数据到文件上,内核缓存(注意这个不是用户层缓存区)区长度是100字节,如果调用不带缓存的IO函数write()就要调用10次,这样系统效率低,现在在用户层建立另一个缓存区(用户层缓存区或者叫流缓存),假设流缓存的长度是50字节,我们用标准C库函数的fwrite()将数据写入到这个流缓存区里面,流缓存区满50字节后在进入内核缓存区,此时再调用系统函数write()将数据写入到文件(实质是磁盘)上,
总之,标准IO操作fwrite()最后还是要调用无缓存IO操作write,这里进行了两次调用fwrite()写100字节也就是进行两次系统调用write()
带缓存的文件I/O操作用到的主要函数有:
FILE*fopen(char*filename,char*mode)
filename文件名称
mode打开模式:
r:
文件必须已经存在,为读而打开。
r+:
文件必须已经存在,为读和写而打开。
w:
创建文件或为写打开文件,如果文件存在则会清空原文件内容。
w+:
创建文件或为读和写而打开文件,如果文件存在则会清空原文件内容。
a:
追加,即在文件尾加入内容,或为写而创建文件。
a+:
在文件尾写内容,或者为读和写而创建文件。
另外,以二进制方式打开文件时,在mode中同时加上b,如rb,r+b,rb+,w+b,ab+等,则以二进制方式进行读写,如果不加b,则以文本方式打开文件。
而UNIX环境不区分文本和二进制方式,所以在UNIX下加b并无作用。
intfclose(FILE*fp);
fclose函数关闭一个流,其调用内核close关闭流对应的文件描述符。
如果此时I/O缓冲区还有数据,则调用内核write写到到文件中,再调用close,然后释放FILET缓冲区。
当进程终止而没有显示调用fclose时,所有未写入的缓冲区的数据将会被写入,并关闭所有打开的流。
【实验要求和步骤】
掌握linux下文件的基本操作命令。
了解带缓存文件和不带缓存文件的创建,打开,关闭,读写操作,进一步掌握实验七中使用字符设备的c文件。
生成简单操作系统内核,加载入虚拟机执行。
1.新建一个文件夹a,并在文件夹里新建一个文件fa,新建另一个文件夹b,将文件fa复制到文件夹b中。
2.设计一个程序,要求以可读写方式打开一个文件,如果该文件不存在,则创建此文件,如果存在,将文件清空后关闭。
输入以下代码:
#include
#include
#include
/*以读写方式打开当前目录下的lilan文件,如果不存在则创建该文件,并且将文件权限设置为拥有者可读,可写,可执行*/
intmain(void)
{
intfd;
fd=open("lilan",O_CREAT|O_RDWR|O_TRUNC,0700);
/*选项O_TRUNC表示文件存在时清空
选项O_RDWR表示以读写方式打开
选项O_CREAT表示如果文件不存在则新建文件
*/
if(fd==-1){
perror("failtoopen");
exit
(1);
}else
printf("打开(创建)文件,文件描述符为:
%d\n",fd);
close(fd);
return0;
}
3.写代码将步骤2所创建的文件复制成新文件,使用read函数从源文件读取数据,再用write函数写入到目标文件。
输入以下代码:
#include
");/*提示输入目标文件名*/scanf("%s",des);/*读入目标文件名*/fdsrc=open("lilan",O_RDONLY);/*只读方式打开源文件*/if(fdsrc==-1){
perror("failtoopen");
exit
(1);
}fddes=open(des,flags,0644);/*打开目标文件的权限为:
644*/if(fddes==-1){
perror("failtoopen");
exit
(1);
}while((nbytes=read(fdsrc,buf,20))>0){z=write(fddes,buf,nbytes);if(z<0){perror("写目标文件出错");/*此函数可以用来输出“错误原因信息”字符串*/}}close(fddes);close(fdsrc);printf("复制文件为\"%s\"文件成功!
\n",des);exit(0);}
改写上面的程序,源文件名和目标文件名都由键盘输入。
4.设计程序,把键盘上输入的字符串以带缓存的方式写入文件“liufile”,如果该文件不存在,则创建此文件。
输入以下代码:
#include
intmain(void){FILE*fp;/*定义文件变量指针*/
chars[80];if((fp=fopen("liufile","a+"))==NULL)/*打开(创建)文件*/{printf("打开(创建)文件出错");/*出错处理*/exit(0);}printf("请输入要写入文件的字符串:
");/*提示输入一个字符*/fputs(fgets(s,80,stdin),fp);/*把键盘输入的字符串写入文件*/fclose(fp);/*关闭文件流*/}
改写上面的程序,用带缓存的流文件I/O操作,把键盘上输入的字符串写入一个文件x,如果该文件不存在,则创建此文件,多次运行程序多次输入字符串后,文件x中只保存最后一次输入的字符串,把文件x中的内容读取出来,在终端中打印输出。
5.有两个程序,一个写入程序把三个人的姓名和帐号余额信息,通过一次流文件I/O操作写入文件y,另一个读取程序则格式输出帐号信息,把每个人的帐号和余额一一对应显示输出。
改写下面的程序,从键盘输入账号和余额。
/*写入程序:
把帐号信息写入文件*/#include
#include
/*读出程序,将账号信息读出*/
#include %-20s余额[%d]: %d\n",i,s[i].name,i,s[i].pay);return0;} 6.(选做)将如下程序放在同一目录(注意文件名),输入make,编译成boot.img文件,挂载到虚拟机.这是你的第一个操作系统程序。 从本质上来说它是一个引导程序。 /*boot.S*/ .code16 .text mov%cs,%ax mov%ax,%ds mov%ax,%es callDispStr jmp. DispStr: mov$BootMessage,%ax mov%ax,%bp mov$16,%cx mov$0x1301,%ax mov$0x00c,%bx mov$0,%dl int$0x10 ret BootMessage: .ascii"Hello,OSworld! Lilancome" .org510 .word0xaa55 #Makefile CC=gcc LD=ld LDFILE=solrex_x86.ld OBJCOPY=objcopy all: boot.img boot.img: boot.bin @ddif=boot.binof=boot.imgbs=512count=1 @ddif=/dev/zeroof=boot.imgskip=1seek=1bs=512count=2879 boot.bin: boot.elf @$(OBJCOPY)-R.pdr-R.comment-R.note-S-Obinaryboot.elfboot.bin boot.elf: boot.o $(LD)boot.o-oboot.elf-ec-Tsolrex_x86.ld boot.o: boot.S $(CC)-cboot.S copy: boot.img clean: @rm-fboot.oboot.elfboot.bin distclean: clean @rm-fboot.img release: clean @mvboot.imgsolrex.img /*solrex_x86.ld*/ SECTIONS { .=0x7c00; .text: { _ftext=.;/*Programwillbeloadedto0x7c00.*/ }=0 } •在同一目录下建立如下文件: /*loader.S内核程序*/ .code16 .text mov$0xb800,%ax mov%ax,%gs mov$0xf,%ah mov$'L',%al mov%ax,%gs: ((80*0+39)*2) jmp. /*Makefile*/ CC=gcc LD=ld OBJCOPY=objcopy CFLAGS=-c TRIM_FLAGS=-R.pdr-R.comment-R.note-S-Obinary LDFILE_BOOT=solrex_x86_boot.ld LDFILE_DOS=solrex_x86_dos.ld LDFLAGS_BOOT=-T$(LDFILE_BOOT) LDFLAGS_DOS=-T$(LDFILE_DOS) all: boot.imgLOADER.BIN @echo'#################################################################' @echo'#Compilingworkfinished,nowyoucanuse"sudomakecopy"to' @echo'#copyLOADER.BINintoboot.img' @echo'#################################################################' boot.bin: boot.S $(CC)$(CFLAGS)boot.S $(LD)boot.o-oboot.elf$(LDFLAGS_BOOT) $(OBJCOPY)$(TRIM_FLAGS)boot.elf$@ LOADER.BIN: loader.S $(CC)$(CFLAGS)loader.S $(LD)loader.o-oloader.elf$(LDFLAGS_DOS) $(OBJCOPY)$(TRIM_FLAGS)loader.elf$@ boot.img: boot.bin @ddif=boot.binof=boot.imgbs=512count=1 @ddif=/dev/zeroof=boot.imgskip=1seek=1bs=512count=2879 #Youmusthavetheauthoritytodomount,oryoumustuse"suroot"or #"sudo"commandtodo"makecopy" copy: boot.imgLOADER.BIN @mkdir-p/tmp/floppy;\ mount-oloopboot.img/tmp/floppy/-ofat=12;\ cpLOADER.BIN/tmp/floppy/;\ umount/tmp/floppy/;\ rm-rf/tmp/floppy/; clean: @rm-f*.o*.elf*.bin*.BIN distclean: clean @rm-fboot.img release: clean @mvboot.imgsolrex.img ================================================== /*solrex_x86_boot.ld*/ SECTIONS { .=0x7c00; .text: { _ftext=.; }=0 } ================================================== /*solrex_x86_dos.ld*/ SECTIONS { .=0x0100; .text: { _ftext=.; }=0 } ================================================ /*boot.S*/ .code16 .setBaseOfStack,0x7c00/*Stackbaseaddress,inner*/ .setBaseOfLoader,0x9000/*SectionloadingaddressofLOADER.BIN*/ .setOffsetOfLoader,0x0100/*LoadingoffsetofLOADER.BIN*/ .setRootDirSectors,14/*Rootdirectorysectorcount*/ .setSecNoOfRootDir,19/*1stsectorofrootdirectory*/ .setSecNoOfFAT1,1/*1stsectorofFAT1*/ .setDeltaSecNo,17/*BPB_(RsvdSecCnt+NumFATs*FATSz)-2*/ /*Startsectoroffilespace=*/ .text /*FloppyheaderofFAT12*/ jmpLABEL_START/*Starttoboot.*/ n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验八 文件管理实践 实验 文件 管理 实践
![提示](https://static.bdocx.com/images/bang_tan.gif)