Linux编程与应用课件:文件系统课件修改.ppt

上传人(卖家):罗嗣辉 文档编号:2045788 上传时间:2022-01-21 格式:PPT 页数:109 大小:5.19MB
下载 相关 举报
Linux编程与应用课件:文件系统课件修改.ppt_第1页
第1页 / 共109页
Linux编程与应用课件:文件系统课件修改.ppt_第2页
第2页 / 共109页
Linux编程与应用课件:文件系统课件修改.ppt_第3页
第3页 / 共109页
Linux编程与应用课件:文件系统课件修改.ppt_第4页
第4页 / 共109页
Linux编程与应用课件:文件系统课件修改.ppt_第5页
第5页 / 共109页
点击查看更多>>
资源描述

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)指定的

26、位置(可以超过文件长度,基延长文件长度,空洞部分值为0),返回新指针值。 whence: 起点 SEEK_SET(0) /* 文件头 */ SEEK_CUR(1) /* 当前文件读写指针所在位移 */ SEEK_END(2) /* 文件尾 */ offset:位移量文件读写指针的缺省值:读写打开时为0,附加写打开时为文件尾。f_offset(文件指针)SEEK_SET(0)SEEK_CUR(1)SEEK_END(2)offsetoffsetoffset 移动文件指针移动文件指针lseek文件尾文件头 例例 3 间隔读字符间隔读字符#include main(int argc, char *ar

27、gv)int fd, skval;char c; if( argc != 2) exit();fd = open(argv1, O_RDONLY);if( fd = -1) exit();while ( ( skval = read(fd, &c, 1); printf(“char %c n” , c);skval = lseek(fd, 1023L,1);printf(“new seek val %d n” ,skval); 0102420483072 例例 4 读一段字符读一段字符# include main()int fd;char buf 1024 ;fd = creat ( “myf

28、ile”, 0666);lseek( fd, 2000L, 0);write( fd, “hello”,5 );close(fd); fd = open( “myfile”, O_RDONLY );read ( fd, buf, 1024);read ( fd, buf, 1024);read ( fd, buf, 1024);0102420482000hello3072hello文件控制文件控制: int fcntl (int fd, int cmd, /* int arg */); 改变文件的性质。cmd表示五种功能:F_DUPFD: 复制文件描述字;F_GETFD / F_SETFD:

29、获得/设置文件描述字标志FD_CLOSEXEC ( 默认为0,表示在进程exec后不关闭该文件);F_GETFL :读文件状态:O_RDONLY(只读), O_WRONLY(只写), O_RDWR(读写),O_APPEND(附加), O_NONBLOCK(非阻塞IO), O_SYNC(同步), O_ASYNC(异步)。F_SETFL: 设置文件状态: O_APPEND, O_NONBLOCK, O_SYNC, O_ASYNCF_GETOWN / F_SETOWN: 获得/设置接受SIGIO信号(异步IO)或SIGURG信号(网络紧急数据)的进程ID或进程组ID;F_GETLK / F_SETL

30、K / F_SETLKW: 获得/设置文件记录锁。 文件控制文件控制fcntl 三。文件与目录函数三。文件与目录函数n读取文件信息读取文件信息n访问权限访问权限n文件连接文件连接n特殊文件特殊文件 int stat ( const char *pathname, struct stat *buf); int lstat ( const char *pathname, struct stat *buf); 返回符号连接信息 int fstat ( int fd, struct stat *buf); 将文件的信息(来自inode)读入 buf,ls 命令需要这个函数。 struct stat m

31、ode_t st_mode; /* 文件类型与访问许可 */ ino_t st_ino; /* i节点号 */ dev_t st_dev; /* 所在设备号 */ dev_t st_rdev; /* 特殊文件设备号 */ nlink_t st_nlink; /* 连接数 */ uid_t st_uid; /* 文件主用户id */ gid_t st_gid; /* 文件主组id */ off_t st_size; /* 普通文件规模(字节数)*/ time_t st_atime; /* 最近访问时间 */ time_t st_mtime; /* 最近修改时间 */ time_t st_ctim

32、e; /* 最近文件状态改变时间 */ long st_blksize; /* 最好的IO块规模 */ long st_blocks; /* 512字节块数 */ ; 读取文件信息读取文件信息stat 在中的文件类型宏(读 i_mode)宏文件类型S_ISREG()普通文件S_ISDIR()目录文件S_ISCHR()字符特殊文件S_ISBLK()块特殊文件S_ISFIFO()FIFOS_ISLNK()符号连接S_ISSOCK()套接口位 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 IFREG 普通文件 IFDIR 目录 IFCHR 字符设备 IFIFO 管道块设

33、备IFBLKi_mode套接字IFSOCK符号链接 IFLNK 例例5. 打印文件类型打印文件类型#include#include#includeint main(int argc, char *arg)int I;struct stat buf;char *ptr;for(i=1; i argc; i+) printf( “%s: “, argvi );if (lstat(argvi, buf) 0 ) err_ret(“lstat error”); continue if (S_ISREG(buf.st_mod) ptr = “ regular ”;else if (S_ISDIR(buf

34、.st_mod) ptr = “ directory ”;else if (S_ISCHR(buf.st_mod) ptr = “ character special”;else if (S_ISBLK(buf.st_mod) ptr = “ block special ”;else if (S_ISFIFO(buf.st_mod) ptr = “ fifo ”;else if (S_ISLNK(buf.st_mod) ptr = “ symbolic link ”;else if (S_ISSOCK(buf.st_mod) ptr = “ socket ”;else ptr = “ * un

35、known mode ”;printf( “ %s n”, ptr );exit(0);程序打印内容如下:$ a.out /vmLinux /etc /dev/ttya /dev/sd0a /var/spool/cron/FIFO /bin /dev/printer /vmLinux: regular /etc: directory /dev/ttya: character special /dev/sd0a block special /var/spool/cron/FIFO: fifo /bin symbolic: link /dev/printer: socket 修改访问权限修改访问权

36、限Linux的文件保护机制采用访问控制表(access control list)的简化:访问用户分为三类:文件主(owner User - u),同组用户(Group - g),其它用户(Other - o);文件访问类型分为三种:读(read - r),写(write - w),执行(execute - x); 目录解释:读(read):对目录中文件名的列表; 写(write): 执行(execute):搜索目录;对于指定文件3类用户的3种访问类型形成9种组合,用i节点中的i_mode 中的低9位表示:位 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0r w x

37、 r w x r w xi_modeowner (u) group(g) other(o) ISUID(set_uid位s)ISGID(set_gid位s)ISVTX(粘住位) chmodInt chmod ( const char *pathname, mode_t mode );Int fchmod ( int fd, mode_t mode ); 这两个函数用于更改指定文件的访问权限。chmod针对路径名pathname指定的文件,fchmod针对文件描述字fd 指定的打开文件。 如果更改访问权限则进程的有效用户号必须是文件主的用户号。 mode 取值为如下常数(中定义)表示的逐位或运算

38、: S_IRWXU (文件主可读,写,执行) S_IRUSR (文件主可读) S_ IWUSR(文件主可写)S_ IXUSR(文件主可执行) S_IRWXG (同组用户可读,写,执行) S_ IRGRP(同组可读)S_ IWGRP(同组可写)S_ IXGRP(同组可执行) S_IRWXO (其它用户可读,写,执行)S_ IROTH (其它可读)S_ IWOTH(其它可写)S_ IXOTH(其它可执行) S_ ISUID(set_uid)设置用户id位。 S_ ISGID(set_gid)设置用户组id位。 S_ ISVTX( 粘住 ) 粘住(要求正文段不换出内存,只用于对换系统) 例例6. 修

39、改文件权限修改文件权限 int main(void)struct stat statbuf;if (stat(“foo”, &statbuf) 0)err_sys ( “stat error for foo”);if (chmod(“bar”, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) 0)err_sys ( “chmod error for bar”);if (chmod(“foo”, (statbuf.st_mode & S_IXGRP) | S_ISUID) 0)err_sys ( “chmod error for foo”);exit(0); 此程序

40、执行前 ls 产生如下结果:$ ls l bar foo - r w - - - - - - - 1 stevens 1230 Nov 16 16:23 bar- r w x r w x r w - 1 stevens 3210 Nov 16 16:23 foo 此程序执行后 ls 产生如下结果:$ ls l bar foo - r w - r - - r - - 1 stevens 1230 Nov 16 16:23 bar- r w s r w - r w - 1 stevens 3210 Nov 16 16:23 foo 文件连接与删除文件连接与删除int link ( const ch

41、ar *existpath, const char *newpath); 创建一个新目录项newpath ,其中指向现存文件existpath,相当于另起一个文件名。 link 也称硬连接。shell 命令: $ ln exitpath snewpath 限制:1. 只有超级用户才能连接目录文件。 2. 两个文件必须在同一文件系统中(大多数实现)。现存目录项exitpathino新目录项磁盘inodei_nlink=2缺点: 1. 原有文件建立者要想删除文件,难以找到相应的连接者; 2. 不能跨越不同文件系统。newpathino int unlink ( const char *pathna

42、me ); 删除目录项pathname,连接数(nlink)减1。shell 命令: $ rm exitpath $ rm newpath实现 算法:1。搜索文件目录树,找到要删除文件的父目录(namei);2。如果是共享正文文件且连接数为1,则从分区表中清除;3。修改父目录:清除文件名,i 节点置0;4。连接数减1;5。释放i 节点(iput);(如连接数为0并且 i 节点引用数为1则释放所有文件块,释放内存 i 节点,置磁盘 i 节点为空闲, 最终删除此文件)注意:由于这个原因,删除一个正在打开的文件只能删除它的目录项。仅当以后再关闭该文件时(再次执行iput)才会最终释放该节点。下面的例

43、子说明了unlink的这个性质。 例例7. 删除打开的文件删除打开的文件#include #include #include main(int argc, char *argv)int fd;char buf1024;struct stat statbuf;if (argc != 2) exit();if(fd = open(argv1, O_RDONLY ) = -1) exit();/* 打开文件*/if( unlink(argv1) = -1) exit();/* 删除打开文件 */if(stat( argv1, $statbuf) = -1)/* 用文件名查文件状态 */printf(

44、“stat %s fails as it should n”, argv1” ); /* 应该失败*/else printf(“stat %s succeeded! n”, argv1” );if(fstat( argv1, $statbuf) = -1)/* 用 fd 查文件状态 */printf(“stat %s fails! n”, argv1” );else printf(“stat %s succeeded as it should n”, argv1” );/* 应该成功 */while (read( fd, buf, sizeof(buf) ) 0)printf (“%s1024

45、s”, buf);/* 读写应该成功 /此程序退出(exit) 时会关闭所有文件,由于这里的文件已删除,所以会最后清除这个文件。即使此程序异常退出也不会留下未清除的文件。利用unlink的这一特点,用户可以打开文件后立即删除它。以后用户可以正常读写这个文件,不用担心忘记删除它。 符号连接符号连接 符号连接符号连接克服了硬连接的两个缺点。它为新的连接另外申请了一个i节点,并在它指向的文件中保存了原来的文件名。 int symlink ( const char *actpath, const char *sympath); actpath 为现存文件名;sympath 为新的符号连接名。 shel

46、l 命令: $ ln s actpath sympath 执行此操作时不要求actpath文件已经存在, 两个文件名可以不在一个文件系统上。现存目录项actpathino新目录项sympathino磁盘inode磁盘inode符号连接缺点:1。额外的扫描路径;2。额外的I节点;3。额外的存储(存文件名)。 /mnt/usr/actpath 特殊文件特殊文件系统调用Int mknod ( const char *pathname, mode_t mode, dev_t dev); 建立设备特殊文件,fifo文件或普通文件,但不打开。文件主为有效用户号。 pathname: 文件路径名; mode

47、: 文件类型与访问权限;其中类型如下: S_IFCHR: 字符特殊文件; S_IFBLK: 块特殊文件; S_IFIFO: 命名管道(fifo)文件; S_IFREG: 普通文件; dev: 设备号(包括主设备号和次设备号);命令mknod name type major minor name: 文件名 type: 文件类型:c,u: 字符特殊文件;b: 块特殊文件;p: fifo文件; major: 主设备号; minor: 次设备号;四。文件锁定四。文件锁定n概概 述述*nfcntl(2)nlockf(3)nflock(2) 概概 述述* inodeu_ofile fd1inodeopen

48、file 共享文件file u_ofile fd2通信进程打开同一文件,读通信进程打开同一文件,读写时文件锁定机制实现互斥写时文件锁定机制实现互斥目录项目录项openfilenamestruct flock锁定区域锁定区域 fcntl(2) fcntl 实现记录锁实现记录锁 int fcntl(int fd,int cmd,struct flock *flockptr); cmd: F_SETLK 设置锁,如不允许则返回错; F_SETLKW 设置锁,如不允许则等待; F_GETLK 测试能否建立锁;struct flock /* 指定锁类型及锁住的区域 */short l_type; /*

49、锁的类型 */ /* F_RDLCD(共享读),F_WRLCK(独占写),F_UNLCK(解锁)*/off_t l_start; /* 同lseek */short l_where; /*同lseek */off_t l_len; /* 锁定区域的范围 ,区域起址由前两项决定 */pid_t l_pid; /*由 F_GETLK返回 */len0指定位移(l_whence, I_start)len=0 例例8. 加锁与解锁加锁与解锁 void my_lock(int fd) /* 加锁 */ struct flock lock; lock.I_type = F_WRLCK; lock.I_wh

50、ence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; fcntl(fd, F_SETLKW, &lock); void my_unlock(int fd) /* 解锁 */ struct flock lock; lock.I_type = F_UNLCK; lock.I_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; fcntl(fd, F_SETLK, &lock); lockf(3)system V 库函数,调用fcntl(2)实现。int lockf(int fd, int cmd,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(Linux编程与应用课件:文件系统课件修改.ppt)为本站会员(罗嗣辉)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|