操作系统实验6(第十八周)_第1页
操作系统实验6(第十八周)_第2页
操作系统实验6(第十八周)_第3页
操作系统实验6(第十八周)_第4页
操作系统实验6(第十八周)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、甘肃政法学院本科生实验报告(六)姓名:谢慧敏学院:信息工程学院专业:计算机科学与技术班级:2013级计算机科学与技术本科班实验课程名称:操作系统 实验日期: 2016年5月20 日开课时间:2015-2016 学年 第二学期甘肃政法学院实验管理中心印制实验题目文件系统小组合作否姓名谢慧敏班级2013级计算机科学与技术本科班学 号201381010144一、实验目的1、 文件系统是使用计算机信息系统的重要接口。通过实验学习文件系统的系统调用命令,提高对文件系统实现功能的理解和掌握二实验环境Windows 7操作系统Vmware 软件Red hat linux操作系统三、 实验内容与步骤1.检查文

2、件系统的文件类型为了便于用户利用终端进行输入和输出,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/

3、stat.h中定于了文件类型struct stat,并用宏定义来解决文件的类型,每个宏的参数就是结构stat中的st_mode的值。表17-1给出sys/stat.h中定义的文件类型的宏:Linux系统在sys/stat.h中定义了文件类型struct stat,其定义如下:表17-1 宏 struct statdev_tst_dev;*文件所在设备;主次设备号*ino_tst_into;*inode*mode_tst_mode;*protection mode*nlink_tst_nlink;*number of hard links*uid_tst_uid;*user ID of owne

4、r*gid_tst_gid;*group ID of ower*dev_tst_rdev;*device type(if inode device)*off_tst_size;*total size, in bytes*blksize_tst_blksize;*blocksize for filesystem I/O*blkcnt_tst_blocks;*number of blocks allocated*time_tst_atime;*time of last access*time_tst_mtime;*time of last modification*time_tst_ctime;

5、*time of last change*为了熟悉文件的特性,下面给出操作这些文件的有关系统调用命令。#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char * file_name,struct stat * buf);int fstat(int filedes,struct stat*buf);int lsrant(const char * name,struct stat * buf);这些函数返回有关指定文件的信息。使用这些命令,不需要对文件有任

6、何权限,只需要对指定目录有检索权限。stat()函数统计由文件名指定的文件信息,并填充到以steuct stat为结构的buf中;lstat()函数与stat()函数功能一样,只是仅仅统计文件的符号链接时有所不同。fstat()函数与stat()函数功能一样,只是仅仅统计被打开的文件的类型。2.创建新文件creat() UNIX系统把所有文件都看成无结构的字符流式的文件,如果特定的应用中使用了某种类型的数据结构,只能由程序员对数据增加相应的结构。这样使得UNIX对文件的接口变得特别简单。创建一个新文件要使用如下的语句序列:#include<sys/ types.h > #inclu

7、de<sys/ stat.h > #include<sys/ fcntl.h > Int open(const char * pathname ,int oflg,mode_t mode);返回值:如果正确创建,返回文件的描述符;否则返回-1。这里,pathname是要创建文件的路径名。创建文件时,文件只能以只写方式打开,mode用来规定该文件的拥有者,小组用户及其他用户的访问权限。要求用按位逻辑加对下列符号常量(这些符号常量定义在sys/stat.h中)进行所需的组合;S_IRUSR /*文件拥有者的读权限位,即0400*/S_IWUSR /*文件拥有者的写权限位,即

8、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*

9、/S_IRWXO定义为(S_IROTH|S_IWOTH|S_IXOTH)/*即0007*/ 创建文件时,若文件已经存在,只要执行进程对文件所在目录有执行权,并对该文件有写权,系统使原文件的长度置0,释放文件占用的磁盘块,同时保持原文件的mode不变。 3.删除文件unlink() 一个文件可以有多个路径,也即一个inode可能链接多个文件的目录项。系统调用unlink()的作用就是删除指定的目录项。也即将inode中的链接计数nlink减1.若链接计数减1后为0,且无进程正在使用,立即删除该文件(即释放文件的目录项,inode和文件占用的磁盘块),此后,文件不再存在;若链接计数减1后为0,且有

10、进程正在使用,则立即返回,等进程使用完后,再删除;若链接计数减1后不为0,则立即返回。 4.打开文件open() 打开文件使用和creat()相同的头文件序列; #include<sys/ types.h > #include<sys/ stat.h > #include<sys/ fcntl.h > Int open(const char * pathname ,int oflg,mode_t mode); 返回值:如果正确打开,返回文件的描述符;否则返回-1. 其中,参数pathname是待打开的文件路径名;参数oflg规定了打开文件方法;仅当打开的文件

11、不存在,需创建时,才使用mode这个参数规定文件的拥有者、小组用户、其他用户对新文件的访问方式。参数oflg可能的取值为下列3个值之一; O_RDONLY : 以只读方法打开; O_WRONLY:以只写方法打开;O_RDWR;以读写方法打开。该系统调用还允许将oflg与下列标志值进行按位逻辑加,以扩充其功能;O_APPEND;当为(O_WRONLY | O_APPEND)时,打开文件允许向文件尾追加写;否则为覆盖写,即从文件头写。O_CREAT;当为(O_WRONLY | O_CREAT)时,若打开的文件不存在,则创建文件,且必须带有参数mode,以规定文件的拥有者、小组用户、其他用户对新文件

12、的访问方式。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()文件关闭

13、的系统调用格式如下: # include <unistd.h>int close( int fd);其中,fd为文件的文件描述符。 返回值:成功时为0,失败时为-1.6、读文件read()和写文件write() 任何文件在读写之前,必须先打开。文件被成功打开时,返回文件的描述符。只要文件是用O_RDONLY或O_RDWR或O_WRONLY标志打开,就可以用read()或write()系统调用从文件中读或向文件中写若干字节。这两个系统调用可能使用的语句序列如下: # include <unistd.h> ssize_t read( int fd, void * buf,

14、size_t nbytes);或 ssize_t write( int fd, conts void * buf, size_t nbytes); 返回:正确是为0或读写的字节数;错误时为-1. 其中,fd为文件的描述符,buf为读出货写入文件数据的字节数组,第三个参数是要传送的字节个数。例如: Internet fd,n,nread,nwrite; char bufsize; nread=read(fd,buf,n)或 nwrite=write(fd,buf,n); 进行读时,nread为读函数执行完后返回的字节数。返回的字节数可以少于要求读的字节数。当文件为终端时,一般read只读到下一个

15、换行符为止。通常要少于请求的字节数。当返回值为0时,表明文件结束。-1表明出现了错误。 进程写时,返回值为实际写的字节数;如果返回值与实际写的字节数不相等时,则出现错误。 磁盘缓冲块尺寸为512字节或1024字节(可参看stdio.h中的定义)。四、实验过程与分析1、利用上面给出的宏来检查给定文件的类型。程序源代码:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int main(int

16、 argc,char*argv)int i;struct stat bf;char * ptr;for(i=1;i<argc;i+)printf("%s:",argvi);if (lstat(argvi,&bf)<0)/统计符号链接本身的信? printf("*lstat error./n"); continue; if (S_IFMT&bf.st_mode)=S_IFREG) ptr="regular"else if (S_IFMT&bf.st_mode)=S_IFDIR) ptr="d

17、irectory"else if (S_IFMT&bf.st_mode)=S_IFCHR) ptr="character special device"else if (S_IFMT&bf.st_mode)=S_IFBLK) ptr="block special device"else if (S_IFMT&bf.st_mode)=S_IFIFO) ptr="pipe special file"elseptr="*unknown file mode*"printf("%s

18、:n",ptr); exit(0);运行结果:2、 cat命令的简单实现,完成从键盘复制到终端显示器。程序源代码:# include <unistd.h> # define SIZE 512 main() char bufSIZE;int n;while(n = read(0,buf,sizeof buf)>0)write(1,buf,n);exit(0);运行结果:3、open和create系统调用的使用。一个用C语言的复制文件的例子。程序源代码:# include <stdio.h> # include <sys/types.h> # d

19、efine PERM 0644 /*rw for owner,r for group and other*/ char *progname;main(argc,argv) int argc; char *argv; int f1,f2,n; char bufBUFSIZ; progname = argv0; if (argc!= 3) printf("Usage:%s from to",progname); if(f1=open(argv1,0)=-1) printf("can't open %s", argv1); if(f2=creat(ar

20、gv2,PERM)=-1) printf("can't creat %s",argv2); while(n=read(f1,buf,BUFSIZ)>0) if (write(f2,buf,n)!=n) printf("write error",(char * )0); close(f1); close(f2); exit(0);运行结果:4、利用lseek系统调用移动文件程序代码程序源代码:/*lseek.c*/*gcc -o lseek lseek.c*/#include<unistd.h>#include<sys/ty

21、pes.h>#include <fcntl.h>#include <stdio.h>main(int argc,char*argv)int fd,where;char c1;if(argc!=2)exit(1);if(fd=open(argv1,O_RDONLY)=-1)exit(1);lseek(fd,184L,0);where=lseek(fd,0L,1);printf("NOW new pointer value is %d.n",where);while(where=read(fd,&c1,1)=1)printf("the char is %c,"

温馨提示

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

评论

0/150

提交评论