Linux编程与应用课件:文件系统课件修改.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Linux编程与应用课件:文件系统课件修改.ppt》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 编程 应用 课件 文件系统 修改
- 资源描述:
-
1、补充二补充二 文件系统文件系统n一、数据结构一、数据结构n二、基本二、基本IO函数函数n三、文件与目录函数三、文件与目录函数n四、文件锁定四、文件锁定n五、管道五、管道n六、超级块与资源管理六、超级块与资源管理*n七、文件系统管理七、文件系统管理n八、虚拟文件系统八、虚拟文件系统*一、数据结构一、数据结构n文件逻辑结构与读写指针文件逻辑结构与读写指针n文件物理结构文件物理结构n分级目录分级目录n i 节点节点n磁盘分区和文件系统磁盘分区和文件系统n文件表与内存文件表与内存i节点表节点表n文件类型与访问权限文件类型与访问权限 文件逻辑结构文件逻辑结构逻辑块号 0 1 2 3 4 5 6 7文件位
2、移(字节) 0 512 1024 1536 2048 2560 3072 .offset(文件指针)逻辑块号 = (文件指针/块大小)整数块内位移 = (文件指针/块大小)余数读指针offset1写指针offset2进程1进程2进程3 一个文件可以有多个读(或写)指针,一个指针可由不同进程共享或由一个进程独占。 文件物理结构文件物理结构01 9101112 索引表( i_addr )逻辑块号物理块逻辑块号物理块号0 1 i 一级间接二级间接三级间接直接索引i逻辑结构物理结构0 512 i*512文件位移文件最大规模 =10 +128 +128*128 +128*128*128 块offset
3、分级目录分级目录根目录 /Aaino磁盘inode表12目录/A文件名ino文件名inoBbino文件/A/BainobinoAB根目录/目录/A文件/A/B逻辑结构物理实现 i 节点节点 磁盘i节点(index node inode )含有对应文件的所有说明信息。一个文件系统的所有磁盘i节点组成一个表,保存在超级块之后的确定地址。每个节点按其相对位置顺序编号(如 1,2, ),称为 i 节点号。 磁盘i节点的内容如下: 。文件主标识号:用户id(i_uid), 组id(i_gid) 。set_uid位和set_gid位(i_mode) 。文件类型(i_mode) 。文件访问权限(i_mode
4、) 。连接数(i_nlink) 。文件所在物理块号表(索引表 i_addr) 。文件长度 (i_size) 。文件本身设备号(特殊文件i_rdev) 。文件创建修改访问时间(i_ctime, i_mtime, i_atime) 磁盘分区和文件系统磁盘分区和文件系统磁盘文件系统引导块超级块分区分区分区i 节点表i 节点i 节点文件名 ino12k.目录和文件的数据块数据块目录物理磁盘通常划分为若干分区分区,也称虚拟磁盘或逻辑磁盘虚拟磁盘或逻辑磁盘。其中可存放操作系统,文件系统或交换区。kfile1 文件表与内存文件表与内存 i节点表节点表fd4fd2系统文件表(系统唯一)用户文件表(每个进程一个
5、)内存 i 节点表(系统唯一) 目录项文件名r/wfd3fd1ino磁盘inode表复制12i 节点号ino同一指针不同指针 内存内存 i 节点表节点表 为加快文件名在目录树中的搜索速度设立了内存 i 节点表,其中每一项对应一个打开文件。打开文件时将 i 节点由磁盘复制到内存 i 节点表项中,关闭时再复制回磁盘原处。 文件打开时,磁盘i节点复制到内存i节点(除时间信息外),但增加如下内容: 。设备号(所在设备设备号i_dev)。i节点号(所在设备的 i节点号i_ino)。访问计数 (访问此内存i节点的进程数)。使用状态:互斥锁,安装点标志,文件或此节点是否改写。指向 flock 结构的指针 文
6、件关闭时,内存i节点除上述内容外的大部分信息复制到磁盘i节点上,但增加时间等信息: 整个系统只有一个内存i节点表,用以存放系统内所有内存i节点。i节点的大部分内容可由 stat(2) 和 ls 读取。 系统打开文件表系统打开文件表 系统打开文件表简称系统文件表或文件表,此表整个系统只有 一个,每项保存有对应打开文件的当前使用特征。共享此打开文件的各进程在自己的打开文件表中各有一表项,其中的指针指向该文件的文件表项。各表项内容如下:n 文件状态标志: 读(O_RDONLY),写(O_WRONLY), 读写(O_RDWR), 附加写(O_APPEND),非阻塞(O_NONBLOCK), 同步(O_
7、SYNC),异步(O_ASYNC)。 它们可由open(2) 或 fcntl(2) 设置修改。 n 当前文件位移量(读写指针),read/write 由此位移开始向后读写文件的数据。 读写打开时位移量缺省值为0,附加打开时其值为文件尾,打开后可由lseek(2) 重新设置。n i 节点表项指针。每个进程有一个用户打开文件表(或简称用户文件表,描述字表),其大小由内核配置时确定。每一项表示该进程的一个打开文件,表的索引号称为文件描述字(符)。但描述字0,1,2有专门含义:0:标准输入,缺省为键盘输入,可重定向为任一文件;1:标准输出,缺省为屏幕输出,可重定向为任一文件;2:出错输出,指定为为屏幕
8、输出,不可重定向。 文件描述字(符)可由系统调用creat,open返回,由dup复制; 表项内容如下: 。文件描述字标志:目前只有执行关闭标志(close-on-exec)。其值为0(缺省)表示当前进程执行一目标文件时不关闭这个打开文件; 1表示执行某文件时关闭此文件。 此标志可由fcntl(2)设置修改。 。文件表项指针。 用户打开文件表用户打开文件表 文件类型与访问权限文件类型与访问权限位 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0r w x r w x r w x owner group other (u) (g) (o)IRUSR IRGRP IROT
9、HIWUSR IWGRP IWOTHIXUSR IXGRP IXOTH IRWXU IRWXG IRWXO(文件主) (同组) (其它) IFREG(普通文件) IFDIR(目录) IFCHR(字符设备) IFIFO(管道) ISUID(set_uid)ISGID(set_gid)IFSOCKIFLNK块设备IFBLKi_modeISVTX(粘住)套接口符号链接文件类型(文件类型(12-15位)及建立的系统调用位)及建立的系统调用: 普通文件 ( IFREG -100000) creat (), mknod() 目录文件 ( IFDIR - 040000) mkdir() 块设备 ( IFBL
10、K - 060000 ) mknod() 字符设备 ( IFCHR - 020000 ) mknod() 套接口 ( IFSOCK-140000 ) socket() 符号链接 ( IFLNK - 120000 ) symlink() 管道/FIFO ( IFIFO - 010000 ) mknod()访问许可(访问许可(0-8位):位): IRUSR (-000400) (文件主可读) IWUSR(-000200) (文件主可写) IXUSR (-000100) (文件主可执行) IRGRP (-000040) (同组用户可读) IWGRP(-000020) (同组用户可写) IXGRP (
11、-000010) (同组用户可执行) IROTH (-000004) (其它用户可读) IWOTH(-000002) (其它用户可写) IXOTH (-000001) (其它用户可执行)其它(其它(9-11位)位): ISUID(set_uid位-004000)设置用户id位。如此位为1则执行此文件后当前进程有 效用户 号置为文件主用户号。 ISGID(set_gid位-002000)设置用户组id位。如此位为1则执行此文件后当前进程有效组号置为文件主的组号。 ISVTX( 粘住位 -001000)如此位为1则要求正文段不换出内存,只用于对换系统。 二、基本二、基本IO函数函数n打开文件打开文
12、件open n关闭文件关闭文件closen建立文件建立文件creatn复制文件描述字复制文件描述字dupn读写文件读写文件read 和和 writen移动文件指针移动文件指针lseekn文件控制文件控制fcntl 打开文件打开文件: int open (const char *pathname, int oflag,/* , mode_t mode */); 按oflag指定的方式打开pathname 指定的文件,返回文件描述字; oflag: O_RDONLY /* 只读 */ O_WRONLY /* 只写 */ O_RDWR /* 读写 */ O_APPEND /* 附加写 */ O_CR
13、EAT /* 如不存在则创建,配合mode 参数 */ O_EXCL /* 用于原子操作,配合O_CREAT如不存在则创建*/ O_TRUNC /* 如只读或只写则长度截为0 */ O_NOCTTY /* 不作为控制终端 */ O_NONBLOCK /* 非阻塞 */ O_SYNC /* 等待物理IO完成 */ mode : 当有O_CREAT 时,指出访问权限即其它属性。 打开文件打开文件open返回fd用户文件表系统文件表内存i节点表磁盘i节点表复制i节点oflag已存在目录项文件名ino已存在 open实现算法实现算法*文件打开过程文件打开过程open实现算法:1. 按路径名搜索分级目录
14、,找到节点读入内存节点表中;2.检查访问权限(i_mode);3.分配填写系统打开文件表项:读写标志(oflag),文件指针,引用数(+1),i节点指针;4.分配填写用户文件表项:系统文件表项指针;5. 返回文件描述字(用户打开文件表项索引号) 关闭文件关闭文件close*关闭文件关闭文件: int close (int fd) ; 关闭由文件描述符 fd 指向的文件。实现算法:1。由 fd 找到对应的用户文件表项,系统文件表项和内存 i 节点;2。系统文件表项中的引用数减 1 ,如结果为 0则释放此项并将内存i节点中的引用数减 1 ,如结果也为 0 则将此i节点写回磁盘 i 节点,释放内存
15、i 节点; (如连接数为0则释放所有文件块,释放内存 i 节点,置磁盘 i 节点为空闲。)3。如果是设备文件则调用对应的设备关闭函数;4。释放对应的用户文件表项。ref=1ref=2fd3用户文件表系统文件表内存i节点表磁盘i节点表复制i节点文件关闭过程文件关闭过程fd1fd4ref=2ref=1ref=1fd2 建立文件建立文件creat建立文件建立文件: int creat (const char *pathname , mode_t mode ); creat 建立名字为 pathname 属性为mode 的文件,然后按只写方式打开pathname 指定的文件,返回文件描 述字;其效果等
16、同于: open( pathname, O_WRONLY|O_CREAT|O_TRUNC, mode ); 若以读写打开方式创建文件则要用open(): open( pathname, O_RDWR|O_CREAT|O_TRUNC, mode );mode 返回fd用户文件表系统文件表内存i节点表磁盘i节点表复制i节点申请,填初值建立目录项文件名 ino文件建立过程文件建立过程 creat实现算法实现算法*实现算法:1.按路径名搜索分级目录;2.如文件已存在则检查访问权限(i_mode),如不允许则出错返回;3.如文不存在则分配磁盘空闲 i 节点,填初值(mode等),在父目录中分配新目录项,
17、填入文件名和节点号;4. 磁盘 i 节点 读入内存 i 节点(增减部分内容);填写系统打开文件表项(读写标志=只写,文件指针=0,引用数+1,i节点指针);5. 分配填写用户打开文件表项(文件表项指针);6. 如文件已存在则释放存储块;7. 返回文件描述字(用户文件表项索引号) 复制文件描述字复制文件描述字dup 复制文件描述字复制文件描述字: int dup (int fd); fd 为原fd,返回用户打开文件表中未用的编号最小的fd。 int dup2 (int fd, int fd2); fd 为原fd,fd2指定复制的新的文件描述字。如fd2已打开则关闭后再复制。例:把标准输入文件(f
18、d =0) 重定向到 fd 文件: 用户打开文件表系统打开文件表fd0 close(0); dup(fd); close(fd); 或 dup2(fd,0); close(fd);closedupclose键盘重定向文件 fork与文件描述字与文件描述字 与复制文件描述字有关的另一函数是fork() , 它将父进程的全部文件描述字都复制给子进程,因而子进程不仅共享父进程的全部打开文件,也共享它们的文件指针。用户打开文件表用户打开文件表系统打开文件表系统打开文件表fd0fd0offset1offset2父进程子进程复制文件指针文件指针读文件读文件: ssize_t read (int fd, v
19、oid *buff, size_t nbytes); 从文件中文件指针开始读nbytes字节到buff指定的内存区,文件指针后移实际读的字节数,返回实际读的字节数。 fd 文件描述字; buff 内存地址(通常为数组); nbytes 要读的字节数。写文件写文件: ssize_t write (int fd, void *buff, size_t nbytes); 从buff指定的内存区写nbytes到从文件指针开始的文件中,文件指针后移实际写的字节数,返回实际写的字节数。 fd 文件描述字; buff 内存地址(通常为数组); nbytes 要写的字节数。 读写文件读写文件read writ
20、e 例例 1 读写共享读写共享 /* 进程A和进程B以各自的指针分别读写同一个文件 */#includemain() /* 进程A */int fd;char buf512;fd = open( “myfile”, O_RDONLY );read ( fd, buf, sizeof(buf) ); main() /* 进程B */int fd;char buf512;for ( i = 0; i sizeof(buf); i+)bufi = a; fd = open ( “myfile”, O_WRONLY );write ( fd, buf, sizeof(buf) ); 用户文件表系统文件
21、表fd2fd1offset1offset2 例例 2 父子复制父子复制父子两个进程并发地复制同一个文件,它们共享同一个读指针和同一个写指针,由于两者不一定严格同步,因此复制结果可能不确定 。$ copy oldfile newfile oldfile newfile0 1 2 3 4 5 6 7 . . . . . . . 父进程子进程读指针(父子共享)读出后自动移动写指针(父子共享)写入后自动移动 # include /* copy */int fdrd, dwt;char c;int main( int argc, char *argv )if( argc !=3 ) exit(1); i
22、f( fdrd = open ( argv1, O_RDONLY) ) = -1) exit(1);if( fdwt = creat ( argv2, O_0666) ) = -1) exit(1);fork();rdwrt(); /* 父子进程共享正文段 */exit(0);rdwrt() for( ; ; ) if ( read ( fdrd, &c, 1) != 1) return;write ( fdwt, &c, 1);f_offset(文件指针,在系统文件表项内)1逻辑块号0c2nbytes系统缓冲区用户内存buff512512c1c2c1 512读出读出文件读出过程文件读出过程1
23、。由fd 找到文件表项,作权限检查,取文件指针;2。由文件指针计算文件逻辑块号和块内位移; 逻辑块号 = 文件指针/块大小取整数; 块内位移 = 文件指针/块大小取余数;3。查i节点表项的索引表,将逻辑块号转换成物理块号;4。读出对应物理块到系统缓冲区(bread, breada),由块内位移开始取出适当的字节数到指定用户内存(buff);5。如果未达到指定字节数(nbytes),则继续读下一块(转4。),直至读完;6。返回实际读出的字节数。 read 实现算法实现算法* write实现算法实现算法*1. 由fd 找到文件表项,作权限检查,取文件指针;2. 由文件指针计算文件逻辑块号和块内位移
24、; 逻辑块号 = 文件指针/块大小取整数; 块内位移 = 文件指针/块大小取余数;3. 查i节点表项的索引表,将逻辑块号转换成物理块号;4. 由指定用户内存(buff)复制适当的字节数到系统缓冲区中(上述块内位移),可能第一块要先读出到缓冲区;然后同步(bwrite)或延迟写(bdwrite)入对应物理块;5. 如果未达到指定字节数(nbytes),则继续写下一块(转4。),直至写完;6. 返回实际写入的字节数。文件写入过程文件写入过程f_offset(文件指针,在系统文件表项内)1逻辑块号0c2nbytes系统缓冲区用户内存buff512512c1c2c1 512读出读出 分散读集中写分散读
25、集中写Int writev( int fd, const struct iovec *iov, int iovcount);Int readv( int fd, const struct iovec *iov, int iovcount);struct iovecchar *iov_base; 缓冲区起始地址Int iov_len; 缓冲区长度;ioviovecioveciovec内存文件iov-leniov-base移动文件指针:移动文件指针: off_t lseek(int fd, off_t offset, int whence); 文件读写指针设置为(whence,offset)指定的
展开阅读全文