操作系统实验6第十八周.docx
- 文档编号:14089569
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:12
- 大小:67.64KB
操作系统实验6第十八周.docx
《操作系统实验6第十八周.docx》由会员分享,可在线阅读,更多相关《操作系统实验6第十八周.docx(12页珍藏版)》请在冰点文库上搜索。
操作系统实验6第十八周
甘肃政法学院
本科生实验报告
(六)
姓名:
谢慧敏
学院:
信息工程学院
专业:
计算机科学与技术
班级:
2013级计算机科学与技术本科班
实验课程名称:
操作系统
实验日期:
2016年5月20日
开课时间:
2015-2016学年第二学期
甘肃政法学院实验管理中心印制
实验题目
文件系统
小组合作
否
姓名
谢慧敏
班级
2013级计算机科学与技术本科班
学号
201381010144
一、实验目的
1、文件系统是使用计算机信息系统的重要接口。
通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握
二.实验环境
Windows7操作系统
Vmware软件
Redhatlinux操作系统
三、实验内容与步骤
1.检查文件系统的文件类型
为了便于用户利用终端进行输入和输出,UNIX系统做了专门安排。
UNIX系统自动为用户打开3个文件:
标准输入、标准输出和标准错误输出文件,文件描述符分别为0、1、2,缺省时,这些文件是重定向到终端的。
UNIX系统问价有如下的分类
宏文件类型
S_IFREG普通文件
S_IFDIR目录文件
S_IFCHR字符设备文件
S_IFBLK块设备文件
S_IFIFO有名管道文件
S_IFLNK符号链接文件
S_IFSOCK网络套接字文件
普通文件、目录文件、符号链接文件、有名管道文件、字符设备和块设备文件等。
文件的分类主要由其I节点中的i_mode给出。
为了能够检查每个文件的类型,Linux系统在sys/stat.h中定于了文件类型structstat,并用宏定义来解决文件的类型,每个宏的参数就是结构stat中的st_mode的值。
表17-1给出sys/stat.h中定义的文件类型的宏:
Linux系统在sys/stat.h中定义了文件类型structstat,其定义如下:
表17-1宏
structstat{
dev_tst_dev;/*文件所在设备;主次设备号*/
ino_tst_into;/*inode*/
mode_tst_mode;/*protectionmode*/
nlink_tst_nlink;/*numberofhardlinks*/
uid_tst_uid;/*userIDofowner*/
gid_tst_gid;/*groupIDofower*/
dev_tst_rdev;/*devicetype(ifinodedevice)*/
off_tst_size;/*totalsize,inbytes*/
blksize_tst_blksize;/*blocksizeforfilesystemI/O*/
blkcnt_tst_blocks;/*numberofblocksallocated*/
time_tst_atime;/*timeoflastaccess*/
time_tst_mtime;/*timeoflastmodification*/
time_tst_ctime;/*timeoflastchange*/
}
为了熟悉文件的特性,下面给出操作这些文件的有关系统调用命令。
#include
#include
#include
intstat(constchar*file_name,structstat*buf);
intfstat(intfiledes,structstat*buf);
intlsrant(constchar*name,structstat*buf);
这些函数返回有关指定文件的信息。
使用这些命令,不需要对文件有任何权限,只需要对指定目录有检索权限。
stat()函数统计由文件名指定的文件信息,并填充到以steuctstat为结构的buf中;
lstat()函数与stat()函数功能一样,只是仅仅统计文件的符号链接时有所不同。
fstat()函数与stat()函数功能一样,只是仅仅统计被打开的文件的类型。
2.创建新文件creat()
UNIX系统把所有文件都看成无结构的字符流式的文件,如果特定的应用中使用了某种类型的数据结构,只能由程序员对数据增加相应的结构。
这样使得UNIX对文件的接口变得特别简单。
创建一个新文件要使用如下的语句序列:
#include
#include
#include
Intopen(constchar*pathname,intoflg[,mode_tmode]);
返回值:
如果正确创建,返回文件的描述符;否则返回-1。
这里,pathname是要创建文件的路径名。
创建文件时,文件只能以只写方式打开,mode用来规定该文件的拥有者,小组用户及其他用户的访问权限。
要求用按位逻辑加对下列符号常量(这些符号常量定义在sys/stat.h中)进行所需的组合;
S_IRUSR/*文件拥有者的读权限位,即0400*/
S_IWUSR/*文件拥有者的写权限位,即0*200*/
S_IXUSR/*文件拥有者的执行权限位,即0100*/
S_IRGRP/*小组用户的读权限位,即0040*/
S_WGRP/*小组用户的写权限位,即0200*/
S_IXGRP/*小组用户的执行权限位,即0010*/
S_IROTH/*其他用户的读权限位,即0004*/
S_IWOTH/*其他用户的写权限位,即0002*/
S_IXOTH/*其他用户的执行权限位,即0001*/
3个有用的按位加组合定义如下:
S_IRWXU定义为(S_IRUSR|S_IWUSR|S_IXUSR)/*即0700*/
S_IRWXG定义为(S_IRGRP|S_IWGRP|S_IXGRP)/*即0070*/
S_IRWXO定义为(S_IROTH|S_IWOTH|S_IXOTH)/*即0007*/
创建文件时,若文件已经存在,只要执行进程对文件所在目录有执行权,并对该文件有写权,系统使原文件的长度置0,释放文件占用的磁盘块,同时保持原文件的mode不变。
3.删除文件unlink()
一个文件可以有多个路径,也即一个inode可能链接多个文件的目录项。
系统调用unlink()的作用就是删除指定的目录项。
也即将inode中的链接计数nlink减1.若链接计数减1后为0,且无进程正在使用,立即删除该文件(即释放文件的目录项,inode和文件占用的磁盘块),此后,文件不再存在;若链接计数减1后为0,且有进程正在使用,则立即返回,等进程使用完后,再删除;若链接计数减1后不为0,则立即返回。
4.打开文件open()
打开文件使用和creat()相同的头文件序列;
#include
#include
#include
Intopen(constchar*pathname,intoflg[,mode_tmode]);
返回值:
如果正确打开,返回文件的描述符;否则返回-1.
其中,参数pathname是待打开的文件路径名;参数oflg规定了打开文件方法;仅当打开的文件不存在,需创建时,才使用mode这个参数规定文件的拥有者、小组用户、其他用户对新文件的访问方式。
参数oflg可能的取值为下列3个值之一;
O_RDONLY:
以只读方法打开;
O_WRONLY:
以只写方法打开;
O_RDWR;以读写方法打开。
该系统调用还允许将oflg与下列标志值进行按位逻辑加,以扩充其功能;
O_APPEND;当为(O_WRONLY|O_APPEND)时,打开文件允许向文件尾追加写;否则为覆盖写,即从文件头写。
O_CREAT;当为(O_WRONLY|O_CREAT)时,若打开的文件不存在,则创建文件,且必须带有参数mode,以规定文件的拥有者、小组用户、其他用户对新文件的访问方式。
O_EXCL;当为(O_WRONLY|O_CREAT|EXCL)时,若打开的文件不存在,则创建文件,且必须带有参数mode,以规定文件的拥有者、小组用户、其他用户对新文件的访问方式。
当打开的文件存在时,则出错。
使用这个参数可用来检查文件是否已经存在。
O_TRUNC;当为(O_RDWR|O_TRUNC)或(O_WRONLY|O_TRUNC)时,将文件的长度截成0,文件的属性不变。
O_SYNC:
文件以同步方式打开。
若文件以同步方式打开时,进程每次进行write()调用时,都立即修改文件,即进程等待write()调用完成后才能继续执行。
5、文件关闭close()
文件关闭的系统调用格式如下:
#include
intclose(intfd);
其中,fd为文件的文件描述符。
返回值:
成功时为0,失败时为-1.
6、读文件read()和写文件write()
任何文件在读写之前,必须先打开。
文件被成功打开时,返回文件的描述符。
只要文件是用O_RDONLY或O_RDWR或O_WRONLY标志打开,就可以用read()或write()系统调用从文件中读或向文件中写若干字节。
这两个系统调用可能使用的语句序列如下:
#include
ssize_tread(intfd,void*buf,size_tnbytes);
或
ssize_twrite(intfd,contsvoid*buf,size_tnbytes);
返回:
正确是为0或读写的字节数;错误时为-1.
其中,fd为文件的描述符,buf为读出货写入文件数据的字节数组,第三个参数是要传送的字节个数。
例如:
Internetfd,n,nread,nwrite;
charbuf[size];
nread=read(fd,buf,n)
或
nwrite=write(fd,buf,n);
进行读时,nread为读函数执行完后返回的字节数。
返回的字节数可以少于要求读的字节数。
当文件为终端时,一般read只读到下一个换行符为止。
通常要少于请求的字节数。
当返回值为0时,表明文件结束。
-1表明出现了错误。
进程写时,返回值为实际写的字节数;如果返回值与实际写的字节数不相等时,则出现错误。
磁盘缓冲块尺寸为512字节或1024字节(可参看stdio.h中的定义)。
四、实验过程与分析
1、利用上面给出的宏来检查给定文件的类型。
程序源代码:
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
inti;
structstatbf;
char*ptr;
for(i=1;i { printf("%s: ",argv[i]); if(lstat(argv[i],&bf)<0)//统计符号链接本身的信? {printf("**lstaterror.../n"); continue; } if((S_IFMT&bf.st_mode)==S_IFREG){ ptr="regular"; } elseif((S_IFMT&bf.st_mode)==S_IFDIR){ ptr="directory"; } elseif((S_IFMT&bf.st_mode)==S_IFCHR){ ptr="characterspecialdevice"; } elseif((S_IFMT&bf.st_mode)==S_IFBLK){ ptr="blockspecialdevice"; } elseif((S_IFMT&bf.st_mode)==S_IFIFO) { ptr="pipespecialfile"; } else{ ptr="****unknownfilemode***"; } printf("%s: \n",ptr); } exit(0); } 运行结果: 2、cat命令的简单实现,完成从键盘复制到终端显示器。 程序源代码: #include #defineSIZE512 main() { charbuf[SIZE]; intn; while((n=read(0,buf,sizeofbuf))>0) write(1,buf,n); exit(0); } 运行结果: 3、open和create系统调用的使用。 一个用C语言的复制文件的例子。 程序源代码: #include #include #definePERM0644/*rwforowner,rforgroupandother*/ char*progname; main(argc,argv) intargc; char*argv[]; { intf1,f2,n; charbuf[BUFSIZ]; progname=argv[0]; if(argc! =3) { printf("Usage: %sfromto",progname); } if(f1=open(argv[1],0)==-1) { printf("can'topen%s",argv[1]); } if((f2=creat(argv[2],PERM))==-1) { printf("can'tcreat%s",argv[2]); } while((n=read(f1,buf,BUFSIZ))>0) { if(write(f2,buf,n)! =n) printf("writeerror",(char*)0); } } close(f1); close(f2); exit(0); } 运行结果: 4、利用lseek系统调用移动文件程序代码 程序源代码: /*lseek.c*/ /*gcc-olseeklseek.c*/ #include #include #include #include main(intargc,char*argv[]){ intfd,where; charc1; if(argc! =2) exit (1); if((fd=open(argv[1],O_RDONLY))==-1) exit (1); lseek(fd,184L,0); where=lseek(fd,0L,1); printf("NOWnewpointervalueis%d.\n",where); while((where=read(fd,&c1,1))==1) { printf("thecharis%c,",c1); } printf(".\n"); } 运行结果: 实验分析 实验一实验分析: 对于实验的第1个进行操作时注意stat()函数与lstat()以及fstat()的差别: stat()函数统计由文件名制定的文件信息,并填充到以structstat为结构的buf中;lstat()函数与stat()函数功能一样,只是仅仅统计文件的符号链接时有所不同;fstat()函数与stat()函数功能一样,只是仅仅统计被打开的文件。 实验二实验分析: 如果文件尺寸不是sise的整倍数,某次read命令将返回一个较小的数,这一数即为write命令写入的字节数;下一次调用read时,将返回0。 实验三 实验二使用系统调用signal()都放在一段程序的前面部分,而不是在其他接收信号处。 这是因为signal()的执行只是为进程指定信号量16或17的作用,以及分配相应的stop()过程连接的指针,从而,signal()函数必须在程序前面部分执行。 实验三实验分析: 实验使用了open和create等系统调用,实现cp命令的功能;用管道命令实现cp命令的功能。 实验四实验分析: 该程序以只读方法打开命令行参数argv[1]所给的文件名./lseek.c,然后调用lseeek()将文件的读指针移到184的位置,即语句lseek(fd,184L,0)的开头处。 之后进入循环,从文件中读一个个字符,直到读到文件尾,返回一个错误码为止。 于是,程序执行结果为上面给出的几行信息。 五、实验总结 通过本次实验,我知道了文件系统是使用计算机信息系统的重要接口。 通过实验学习文件系统的系统调用命令,提高了我对文件系统实现功能的理解和掌握。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 第十八