已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验五 文件管理【实验目的】1. 掌握LINUX下文件操作。2. 加深对文件,目录,文件系统等概念的理解。3. 掌握有关LUNIX文件系统操作的常用命令。4. 了解有关文件安全方面的知识。【实验内容】1.使用pwd,cd,ls等命令浏览文件系统。2.使用cat,cp,mv,head,tail,rm等命令查看你的文件。3.使用ln命令进行文件的硬连接和符号连接。4.使用chmod命令修改文件的权限。【实验相关资料】一、文件系统概念1 Linux文件系统布局Ext2是Linux文件系统类型,它很好地继承了Unix文件系统的主要特色,如普通文件的三级索引结构,目录文件的树型结构和把设备作为特别文件等。Linux文件系统是一个逻辑的自包含的实体,它含有节点,目录和数据块。Linux将整个磁盘划分成若干分区,每个分区被当做独立的设备对待;一般需要一个主分区Native和一个交换分区swap。主分区用于存放文件系统,交换分区用于虚拟内存。主分区内的空间又分成若干个组,每个组内都包含有一个超级块的拷贝,以及节点和数据块等信息,如下图所示。Ext2文件卷的逻辑块大小可到1 K,2 K和4 K三种,当块大小为1 K时,每组内包含1024*8=8192个逻辑块。文件卷逻辑块的磁盘存储空间安排如下: 引导块超级块节点位图组描述符节点表 数据区 当文件卷为可引导的系统时,引导块的内容为引导信息,否则内容为空。文件系统都以引导块(boot block)开始,引导块中包含有可执行代码。启动计算机时,硬件从引导设备将引导块读入内存,转而执行其代码。引导块代码开始操作系统本身的加载过程。一旦系统启动之后,引导块不再使用。 超级块(Super-block)中含有文件系统的布局信息,其主要功能是给出文件系统不同部分的大小。如给定块大小,节点总数,每组内节点数,空闲块和节点数等。在Linux启动时,根设备中的超级块被读入内存中,存放在Struct ext2_super_block结构中。Struct ext2_super_blockunsigned long s_inodes_count; /*文件卷节点数*/unsigned long s_blocks_count; /*文件卷逻辑块总数*/unsigned long s_r_blocks_count; /*为超级用户保留的块数*/unsigned long s_free_blocks_count; /*空闲块数*/unsigned long s_free_inodes_count; /*空闲节点数*/unsigned long s_first_data_block; /*第一个数据块数*/在软盘用作Linux文件系统之前,实用程序mkfs可用来创建文件系统。#mkfs /dev/fd0 1440 该命令在软驱中的软盘上创建1400个块的空文件系统,该命令还在超级块中写入魔数(s_magic),表明该文件系统是一个有效的Linux文件系统。魔数能表明文件系统的版本。Mount系统调用检查超级块中的魔数和其它信息,以决定是否安装其它文件系统,如windows9x文件系统。2、位图 Linux文件系统用位图来管理磁盘块和节点,位图分为块位图和节点位图。块位图占用一个磁盘块,当某位为“”时,表示磁盘块空闲,为“”时表示磁盘块被占用。节点位图也占用一个磁盘块,当它为“”时,表示组内某个对应的节点空闲,为“”时表示已被占用。位图使系统能够快速地分配节点和数据块,保证同一文件的数据块能在磁盘上连续存放,从而大大地提高了系统的实时性能。 在创建文件时,文件系统必须在块位图中查找第一个空闲节点,把它分配给这个新创建的文件。在该空闲节点分配使用后,就需要修改指针,使它指向下一个空闲节点。同样地,节点被释放后,则需要修改指向第一个空闲节点的指针。3节点表 节点表占用若干个磁盘块,它几乎与标准Unix的节点表相同。每个节点占128个字节,读入缓冲区后存放在Struct ext2_inode 中。Struct ext2_nodeu16 i_mode; /*文件模式*u16 i_uid; /*文件主用户标识符*/u_32 i_size; /*文件大小*/u_32 i_atime /*最佳访问文件时间*/u_32 i_stime; /*文件创建时间*/u_32 i_mtime; /*文件最近修改时间*/u_32 i_dtime; /*文件删除时间*/u16 i_links_count; /*文件连接计数*/u16 i_gid; /*文件主的用户组标识符*/u32 i_blocks; /*文件的总块数*/u32 i_flag; /*文件标志*/u32 i_blocdEXT2_N_BLOCKS; /*文件地址块索引表*/u32 i_file_acl; /*文件访问控制表*/u32 i_dir_acl; /*目录访问控制表*/ I节点表中的模式信息,给出了文件的类型,如:普通文件,目录文件,块设备文件,字符设备文件,管道文件等。节点的链接数域记录了有多少个目录指向这个节点。这样文件系统就知道什么时候该释放文件的存储区。4目录结构 ext2采用动态方式管理它的目录,用一个单项链表示它的目录项,每个目录项的数据结构为:Struct ext2_dir_entry_u32 inode; /*对应的节点*/_u16 inode; /*目录项长度*/_u16 inode /*名字长度*/charnameEXT2_NAME_LEN; /*文件名*/ 当要删除一个目录时,要将目录项中的节点置为“”,并把目录项从链表中删除,目录项所占用的空间被合并到前一个目录项空间中。5Ext2程序库 Ext2程序库提供了大量的例程,能通过直接控制物理设备来操作文件系统。Ext2程序库使用软件抽象技术以达到最大限度的代码重用。例如,程序库提供了许多不同的可重复调用例程(iterator).程序可以简单将函数传递给ext2fs_block_iterate(),它能在每个inode中被调用。另一种iterator函数为同一个目录中的每个文件调用一个用户定义的函数。许多Ext2例程(mke2fs、s2fsck、tune2fs、dumpe2fs 、debugfs)使用该Ext2程序库。这大大简化了这些例程的维护,因为Ext2升级后的新特性只需改变ext2库就可以反映出来。因为Ext2库可编译成共享库映像文件,所以这种代码重用减小了二进文件的长度。因为ext2库的接口十分抽象和通用,无需考虑物理细节,所以编写需要直接存取ext2文件系统的程序很容易。例如,将BSD转储和备份恢复的特性转移到linux平台时,只需做少量的修改:一些依赖于文件系统的函数需要转移到Ext2库。 Ext2库提供许多种操作。第一类操作是与文件系统相关的操作。程序可以用这些操作打开关闭文件、读写位图、在磁盘上创建新的文件系统,也可管理坏盘块列表。第二类操作用来控制目录,它们能建立和展开目录,增加和移走目录项,能析构文件名,找到inode号,也能由inode号确定文件名。最后一类操作是与inode相关的,它能扫描inode表,读写inode,扫描一个inode中所有的盘块。分配和回收例程可以帮助用户程序分配和释放盘块和inode. 由于Ext2核心代码包括多项性能优化,而且Ext2也能实现分配优化。所以它们能大大改善I/O速度,提高I/O组织的灵活性及编程效率。因此,Ext2核心代码及Ext2程序库为开发嵌入式系统及实时应用系统提供了广泛的基础和手段。二、文件操作1.文件的创建和读写 当我们需要打开一个文件进行读写操作的时候,我们可以使用系统调用函数open。使用完 成以后我们调用另外一个close函数进行关闭操作。该函数使用的头文件如下:#include #include #include #include 定义函数:int open(const char *pathname,int flags); int open(const char *pathname,int flags,mode_t mode); int close(int fd); 函数说明:open函数有两个形式。其中pathname是我们要打开的文件名(包含路径名称,缺省是认为在当前路径下面)。flags可以取下面的一个值或者是几个值的组合。 O_RDONLY:以只读的方式打开文件。 O_WRONLY:以只写的方式打开文件。O_RDWR:以读写的方式打开文件。 O_APPEND:以追加的方式打开文件。 O_CREAT:创建一个文件。O_EXEC:如果使用了O_CREAT而且文件已经存在,就会发生一个错误。O_NOBLOCK:以非阻塞的方式打开一个文件。O_TRUNC:如果文件已经存在,则删除文件的内容。 前面三个标志只能使用任意的一个。如果使用了O_CREATE标志,那么我们要使用open的第二种形式。还要指定mode标志,用来表示文件的访问权限。mode可以是以下情况的组合。 - S_IRUSR 用户可以读 S_IWUSR 用户可以写 S_IXUSR 用户可以执行 S_IRWXU 用户可以读写执行 - S_IRGRP 组可以读 S_IWGRP 组可以写 S_IXGRP 组可以执行 S_IRWXG 组可以读写执行 - S_IROTH 其他人可以读 S_IWOTH 其他人可以写 S_IXOTH 其他人可以执行 S_IRWXO 其他人可以读写执行 - S_ISUID 设置用户执行ID S_ISGID 设置组的执行ID - 我们也可以用数字来代表各个位的标志。Linux总共用5个数字来表示文件的各种权限。 00000第一位表示设置用户ID,第二位表示设置组ID,第三位表示用户自己的权限位,第四位表示组的权限,最后一位表示其他人的权限。 每个数字可以取1(执行权限),2(写权限),4(读权限),0(什么也没有)或者是这几个值的和。比如我们要创建一个用户读写执行,组没有权限,其他人读执行的文件。设置用户ID位可以使用的模式是:1(设置用户ID)0(组没有设置)7(1+2+4)0(没有权限,使用缺省) 5(1+4) 即10705 open(temp,O_CREAT,10705); 如果我们打开文件成功,open会返回一个文件描述符。对文件的所有操作就可以对这个文件描述符进行操作。 当我们操作完成以后,我们要关闭文件了,只要调用close就可以了,其中fd是我们要关闭的文件描述符。 文件打开了以后,就可以对文件进行读写了。可以调用函数read和write进行文件的读写。该函数使用的头文件:#include 函数定义:ssize_t read(int fd, void *buffer,size_t count); ssize_t write(int fd, const void *buffer,size_t count); 函数说明: fd是我们要进行读写操作的文件描述符,buffer是我们要写入文件内容或读出文件内容的内存地址,count是我们要读写的字节数。对于普通的文件read从指定的文件(fd)中读取count字节到buffer缓冲区中(记住我们必须提供一个足够大的缓冲区),同时返回count,如果read读到了文件的结尾或者被一个信号所中断,返回值会小于count。如果是由信号中断引起返回,而且没有返回数据,read会返回-1,且设置errno为EINTR。当程序读到了文件结尾的时候,read会返回0。 write从buffer中写count字节到文件fd中,成功时返回实际所写的字节数。 2文件的各个属性 文件具有各种各样的属性,除了我们上面所知道的文件权限以外,文件还有创建时间、大小等等属性,有时侯我们要判断文件是否可以进行某种操作(读,写等等)。这个时候我们可以使用access函数。#include int access(const char *pathname,int mode); pathname:是文件名称,mode是我们要判断的属性。可以取以下值或者是他们的组合。 R_OK文件可以读W_OK文件可以写X_OK文件可以执行F_OK文件存在 当我们测试成功时,函数返回0,否则如果有一个条件不符时,返回-1。如果我们要获得文件的其他属性,我们可以使用函数stat或者fstat。#include #include int stat(const char *file_name,struct stat *buf); int fstat(int filedes,struct stat *buf); struct stat dev_t st_dev; /* 设备 */ ino_t st_ino; /* 节点 */ mode_t st_mode; /* 模式 */ nlink_t st_nlink; /* 硬连接 */ uid_t st_uid; /* 用户ID */ gid_t st_gid; /* 组ID */ dev_t st_rdev; /* 设备类型 */ off_t st_off; /* 文件字节数 */ unsigned long st_blksize;/* 块大小 */ unsigned long st_blocks; /* 块数 */ time_t st_atime; /* 最后一次访问时间 */ time_t st_mtime; /* 最后一次修改时间 */ time_t st_ctime; /* 最后一次改变时间(指属性) */ ; Stat用来判断没有打开的文件,而fstat用来判断打开的文件。我们使用最多的属性是st_ mode。通过着属性我们可以判断给定的文件是一个普通文件还是一个目录,连接等等。可以使用下面几个宏来判断:S_ISLNK(st_mode)是否是一个连接,S_ISREG是否是一个常规文件,S_ISDIR是否是一个目录,S_ISCHR是否是一个字符设备,S_ISBLK是否是一个块设备,S_ISFIFO是否是一个FIFO文件,S_ISSOCK是否是一个SOCKET文件。3.目录文件的操作: 在我们编写程序的时候,有时候会要得到我们当前的工作路径。C库函数提供了getcwd来解决这个问题。 #include char *getcwd(char *buffer,size_t size); 我们提供一个size大小的buffer,getcwd会把我们当前的路径考到buffer中。如果buffer 太小,函数会返回-1和一个错误号。 Linux提供了大量的目录操作函数,我们学习几个比较简单和常用的函数。 #include #include #include #include #include int mkdir(const char *path,mode_t mode); DIR *opendir(const char *path); struct dirent *readdir(DIR *dir); void rewinddir(DIR *dir); off_t telldir(DIR *dir); void seekdir(DIR *dir,off_t off); int closedir(DIR *dir); struct dirent long d_ino; off_t d_off; unsigned short d_reclen; char d_nameNAME_MAX+1; /* 文件名称 */ mkdir创建一个目录,opendir打开一个目录为以后读做准备,readdir读一个打开的目录,rewinddir是用来重读目录,closedir是关闭一个目录,telldir和seekdir类似与ftee和fseek函数。【实验步骤】1.浏览文件系统(1)运行pwd命令,确定你当前的工作目录(2)利用ls l命令显示当前工作目录的内容及文件属性、权限。(3)运行以下命令查看隐藏文件与文件节点号:(反馈信息中.代表本身目录,.代表其父目录;选项a可以显示隐藏文件;选项i可以显示文件的I节点号)ls ai(4)使用带-d选项的ls命令,你只能看到有关子目录的信息(.表示本身目录)。ls d(5)使用命令useradd username建立一个新用户,并使用su username在root和新用户间切换,同时使用ls命令列出根目录的内容,再分别列出各子目录的内容,体会各目录作用及访问权限。Ls l /列出根目录的内容Ls l /bin /列出/bin目录的内容Ls l /dev /列出/dev目录的内容(设备管理文件目录)Ls l /home /列出/home目录的内容(一般用户文件目录)Ls l /root /列出/root目录的内容(超级用户文件目录)2.查看你的文件(1)利用可以将信息放入指定文件中。mkdir hac /建立hac目录cd hac /进入hac目录date file1 /建立新文件file1并将当前日期和时间存放到新建文件file1中Ls l /反馈信息中有新文件 file1。请注意并记下文件长度为: (2)使用cat命令查看file1文件的内容。Cat file1 /显示一行当前日期和时间的信息4利用man命令显示date命令的用法(man命令为显示指定命令的说明文件):man date /该文件内容显示多页,空格翻页,回车换行,末页标志为END键入Q返回$。5将date命令的用法(说明文件内容)附加到文件file1的后面:man date file1ls l 注意file1文件长度为 ,较前变长。6利用cat命令显示文件file1的内容。Cat file1 /文件内容很长,应滚屏显示。Cat file1 | more /分屏显示后,不难看出在原有的一行日期、时间信息后面,附加了很长的date用法说明。7利用ls -l file1命令列出文件file1的较详细的信息。ls -l file1 注意第二字段(链接记数)的值为“1”。8利用ln命令进行文件链接。然后运行ls -l file1,查看显示的第二段的值发生了什么变化。ln file1 ./fa /将当前目录下文件file1 硬链接到上一级目录中取名为fa ls -l file1 / 显示前目录下文件file1的文件信息链接数为“2”,较前多了1。ln s file1 ./fb /将file1软链接到上一级目录中的新文件fb文件中。ls -l file1 / 显示前目录下文件file1的文件信息链接数还为“2”cd . /回上层目录ls l /可以显示出fb文件为链接文件而fa文件为一般文件。cat fa /查看fa内容与file1一样cat fb /查看fb内容与file1一样mkdir 123mv file1 123/ /建立新目录123,将file1移动到123目录下cd haccat fa /回到hac目录下fa可以正常显示cat fb /回到hac目录下fb显示找不到文件链接文件:链接文件指向某个实际的目标文件,其用途类似于Windows中的“快捷方式”,也即当访问链接文件时,实际访问的将是链接文件所指向的目标文件。链接文件分为硬链接文件和符号链接文件,硬链接文件与被链接的目标文件共用同一个索引节点(inode),所以即使目标文件移动到别的目录上,硬链接文件仍然有效。符号链接文件则是记录了目标文件的存放路径,所以目标文件被移动后,符号链接就会失效。3.文件存取权限1存取权限UNIX系统对所有文件设置了存取权限。存取权限让你确定谁可以对你的个人文件和目录行访问,以及可以进行什么操作。把所有用户分为三类:文件主(user),即文件的属主。组用户(group),即文件组的成员。其他用户(other),即能对系统进行访问的所有其他用户。对一个文件的存取权限分为三种:读(r)写(w)执行(x)一组存取权限以及相应的文件类型统称为文件模式。如:rw-r-r-表示文件主有读和写的权限,组用户和其他用户只有读权限。2文件存取权限读权限(r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 检验科危急值报告处理管理规定
- 混凝土养护温湿度监测措施方案
- 装配段不合格品处置流程规范
- 会员裂变活动奖品发放流程
- 长毛犬打结毛发处理规范流程
- 贵宾犬修剪造型规范指南手册
- 机电管线交叉部位检查施工规范
- 医院卫生健康统计数据质控自查报告(2篇)
- 2026年医院度工作总结及度工作计划(2篇)
- 山体崩塌应急物资管理
- 湖州南太湖热电有限公司节能减排技改项目环境影响报告
- 妊娠期高血压疾病诊治指南2020完整版
- 《园艺植物栽培学》课程教学大纲
- 精选测试技术部分课后习题参考答案
- 监理员安全责任书
- 高速公路改扩建经验交流会总结报告
- 2018年-2022年山东历史高考真题五年合集
- GB/T 35125-2017天文望远镜试验方法
- GB/T 24211-2009蒽油
- GB/T 10045-2018非合金钢及细晶粒钢药芯焊丝
- GA/T 832-2014道路交通安全违法行为图像取证技术规范
评论
0/150
提交评论