文件系统.docx
《文件系统.docx》由会员分享,可在线阅读,更多相关《文件系统.docx(11页珍藏版)》请在冰豆网上搜索。
文件系统
实验报告
(2014/2015学年第一学期)
课程名称
操作系统A
实验名称
文件系统
实验时间
2014
年
12
月
8
日
指导单位
指导教师
学生姓名
班级学号
学院(系)
计算机学院
专业
软件工程
实验报告
实验名称
文件系统
指导教师
徐鹤
实验类型
设计
实验学时
2
实验时间
2014.12.08
一、实验目的和要求
1.学习LINUX系统下对文件进行操作的各种命令和图形化界面的使用方法。
2.深入学习和掌握文件管理系统的基本原理和LINUX等操作系统下常用的系统调用,编写一个使用系统调用的例程。
3.实现一个文本文件的某信息的插入和删除
4.实现一个记录文件的某记录的插入和删除
二、实验环境(实验设备)
WindowsXP+VMWare+RedHatLinux8
实验报告
3、实验过程描述与结果分析
①实验指导:
1.目录/proc下与系统相关的文件和目录
(1)/proc/$pid/fd:
这是一个目录,该进程($PID号码进程)每个打开的文件在该目录下有一个对应的文件。
例如:
#ls/proc/851/fd
0 1 2 255
这表示,851号进程目前正在使用(已经打开的)文件有4个,它们的描述符分别是0、1、2、255。
其中,0、1、2依次分别是进程的标准输入、标准输出和标准错误输出设备。
(2)/proc/filesystems:
该文件记录了可用的文件系统类型。
(3)/proc/mounts:
该记录了当前被安装的文件系统信息
例如:
#cat/proc/mount
(4)/proc/$pid/maps:
该文件记录了进程的映射内存区信息。
例如:
#cat /proc/851/maps
2.常用命令讲解
ls命令
用来查看用户有执行权限的任意目录中的文件列表,该命令有许多有趣的选项。
例如:
$ls-liah*
22684-rw-r--r--1bluherusers952Dec2818:
43.profile
19942-rw-r--r--1scalishusers30Jan320:
00test2.out
925-rwxr-xr-x1scalishusers378Sep22002test.sh
上面的列表显示8列:
第1列指示文件的inode,因为我们使用了-i选项。
剩下的列通过-l选项来进行正常显示。
第2列显示文件类型和文件访问权限。
第3列显示链接数,包括目录。
第4和第5列显示文件的所有者和组所有者。
这里,所有者'bluher'属于组'users'。
第6列显示文件大小(单位为所显示的单位,而不是默认的字节数,因为我们使用了-h选项。
第7列显示日期(它看起来像是三列),包括月、日和年,以及当天的时间。
第8列显示文件名。
在选项列表中使用-a将使列表中包含隐藏文件(如.profile)的列表。
处理文件
可以移动(mv)、复制(cp)或删除(rm)文件和目录。
明智地使用-i选项,以获得确认通常是个不错的主意。
$cp-ils.outls2.out
cp:
overwrite`ls2.out'?
mv命令允许使用-b选项,这将在移动文件之前作一个备份拷贝。
rm和cp接受功能强大但却危险的-r选项,它将在一个目录和它的文件上递归执行。
$rm-irTest
rm:
descendintodirectory`Test'?
y
可以用mkdir来创建目录,用rmdir来删除目录。
不过,因为不能用rmdir来删除包含文件的目录,所以使用rm加-r选项通常要更方便些。
出于安全的原因,所有的文件都有所有权和保护。
文件访问权限(或文件模式)包含之前提到的相同的10个字符:
第一个字符指示文件类型。
最常见的是-代表文件,d代表目录,而l代表链接。
接下来的9个字符是三种用户类别的访问权限:
文件所有者(字符2-4),用户组(5-7)和其它(8-10),其中r表示读权限,w表示写权限,x指示一个文件上的执行权限。
破折号-如果出现在这九个位置的任意一个,则指示这个操作对该类别的用户禁止。
可以使用chmod命令通过字符符号或二进制掩码来设置访问权限。
要使用二进制掩码,必须将三个权限组的字符表示转换成二进制格式,然后转换成八进制格式:
用户类别:
所有者用户组其它
字符表示:
rwxr-xr--
二进制表示:
111101100
八进制表示:
754
将写权限赋予用户组,可以使用:
chmodg+wtest.shorchmod774test.sh
用umask命令,在/etc/init.dev文件中进行系统范围内的、或在.profile文件中进行的本地的文件权限默认设置。
这个命令指示用777减去这个数字来获取默认的权限:
$umask022
这将为用户创建的所有新文件生成一个默认的文件权限755。
可以用chown来修改文件的所有权:
$chownbluherls.out
这里,bluher是新的文件所有者。
类似地,组成员资格将按以下方式修改:
$chgrpdevgrpls.out
这里,devgrp是新的用户组。
ls不提供哪些文件是文本的,哪些文件是二进制的的信息。
要了解这个信息,可以使用file*命令。
重命名文件
赋予一个文件多个名字的两种流行的方法是利用链接和alias命令。
Alias可以用来为一个更长的命令重新起一个更方便的名字:
$aliasll='ls-l'
$ll
注意单引号的使用,这使得BASH将该项目传递给别名,而不是自己估计它。
别名还可用作较长的路径名的缩写:
$aliasjdev9i=/jdev9i/jdev/bin/jdev
cat、more和less
命令让能够从命令行查看一个文本文件的内容,而无需调用编辑器。
Cat是'concatenate'的缩写,它将默认地在标准输出(显示屏)上显示文件内容。
和cat一起提供的最有趣的选项之一是-n选项,它用编号的输出行来显示文件内容。
$cat-ntest.out
1Thisisatest.
因为cat一次性输出文件中的所有行,所以可能更喜欢用more和less,因为它们都一次输出一屏的文件内容。
Less是more的一个增强的版本,它允许用来自vi文本编辑器的关键命令来增强文件查看。
例如,d向前翻滚、b向后翻滚N行(如果N是在d或b之前指定的)。
为N输入的值成为随后的d命令的默认值。
man页面实用工具使用less来显示使用说明的内容。
重定向和管道
重定向允许将命令输出重定向到文件中,而不是标准输出,或者类似地,也可重定向输入。
重定向的标准符号〉创建一个新的文件。
〉〉符号将输出添加到一个现有的文件中:
$moretest2.out
Anothertest.
$cattest.out〉〉test2.out
$cattest2.out
Anothertest.
Thisisatest.
到文件的标准输入可以用〈符号来重定向:
$cat〈test2.out
错误消息用2〉和2〉〉来重定向和添加,格式如下:
$command2〉name_of_error_file
重定向在一个命令和文件之间、或文件和文件之间工作。
重定向语句的一项必须是一个文件。
管道使用|符号,并且在命令之间工作。
例如,可以用以下方式将一个命令的输出直接发送到打印机上:
$ls-l*|lpr
可以用以下方式快速地找到历史列表中的一个命令:
$history|grepcat
查找文件
find命令的GNU版本非常强大、灵活并且比UNIX系统上存在的经典版本更具包容性。
它对于涉及到目录结构的任务非常有用,包括在文件上查找和执行命令。
find命令的基本格式是:
$findstartdirectoryoptionsmatchcriteria[actionoptions]
如果知道文件的名称、或者甚至名称的一部分,但不知道它所处的目录,可以这么做:
$find.-name'test*'
./test
./jdevhome/mywork/EmpWS/EmpBC4J/test
与经典的UNIX系统不同,在Linux中不需要在末尾添加-print操作,因为如果没有指定其它的操作选项,就将假定执行这个操作。
在目录起始位置上的一个点(.)将使find在的工作目录中开始搜索。
两个点,..,在父目录中开始搜索。
可以在任意目录下开始搜索。
注意,可以使用通配符作为搜索准则的一部分(只要用单引号将整个项目括起来)。
$find.-name'test*'-print
./test.out
./test2.out
显示拥有.out扩展名的一系列文件:
$find/home-name'*.out'
不过记住,除非是作为超级用户运行这个命令,否则将可能得到许多的'Permissiondenied'错误消息。
3.Linux常用文件系统调用
(1)open系统调用
格式:
#include
#inckude
#include
intopen(char*path,intflags,mode_tmode);
其中:
参数path是指向所要打开的文件的路径名指针。
参数falgs规定如何打开该文件它必须包含以下三个值之一
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读/写打开
参数mode规定对该文件的访问权限,定义在中
(2)read系统调用
格式:
#include
#include
intread(intfd,void*buf,size_tnbytes)
该系统调用从文件描述符fd所代表的文件中读取nbytes个字节,buf指定的缓冲区内。
所读取的内容从当前的读/写指针所指示的位置开始,这个位置由相应的打开文件描述中的偏移值(off_set)给出,调用成功后文件读写指针增加实际读取的字节数。
使用read系统调用时,应注意设置的数据缓冲区充分大,能够存放所要求的数据字节,因为内核只复制数据,不进行检查。
返回:
-1:
错误
0:
文件偏移值是在文件结束处
整数:
从该文件复制到规定的缓冲区中的字节数。
通常这个字节数与所请求的字节数相同。
除非请求的字节数超过剩余的字节数,这时将返回一个小于请求的字节数的数字。
(3)write系统调用
格式:
#include
#include
intwrite(intfd,void*buf,size_tnbytes)
该调用从buf所指的缓冲区中将nbytes个字节写到描述符fd所指的文件中。
(4)close系统调用
格式:
#include
intclose(intfd)
每打开一个文件,系统就给文件分配一个文件描述符,同时为打开文件描述符的引用计数加1。
Linux文件系统最多可以分配255个文件描述符。
当调用close()时,打开文件描述符的引用计数值减1,最后一次对close()的调用将使应用计数值为零。
虽然当一个进程结束时,任何打开的文件将自动关闭,明显地关闭任何打开的文件是良好的程序设计习惯。
②实验步骤(附程序原码):
#include
#include
#include
#include
#include
#include
#include
#include
#include
main()
{
intfd0,record_len,buff_len;
charfilename[50],f_buff[2000];
strcpy(filename,"/example.txt");
fd0=open(filename,O_RDWR|O_CREAT,0644);
if(fd0<0)
{
printf("Cann'tcreateexample.txtfile!
\n");
exit(0);
}
buff_len=20;record_len=10;
lseek(f,0,SEEK_SET);
cnt=read(fd0,f_buff,record_len*buff_len);/*读文件*/
cnt=cnt/record_len;
printf(“%s\n”,f_buff);
strcpy(f_buff,”1234567890”);
write(fd0,f_buff,strlen(f_buff));/*写文件*/
write(fd0,”\n\r”,2);
close(fd0);
}
③实验截图:
实验报告
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
一、本实验是模拟Linux文件管理系统,在实验的过程中对Linux文件管理系统有了深刻的认识。
二、通过实验我学习到了查找文件find命令的GNU版本非常强大、灵活并且比UNIX系统上存在的经典版本更具包容性。
它对于涉及到目录结构的任务非常有用,包括在文件上查找和执行命令。
find命令的基本格式是:
$findstartdirectoryoptionsmatchcriteria[actionoptions]。
三、在学习此类课程时我们要多实践才能了解到更多。
五、指导教师评语
成绩
批阅人
日期