文件小结

对文件学习有了一定的了解,想整理一下文件所学所用到的一些函数。

1.

     在设计程序是可依靠上述两个函数对文件访问权限进行修改。

     由shell命令中man 2 chmod可看出chmod和fchmod的区别就是对文件的操作中chmod以文件名为条件,而fchmod以文件描述符做条件。

     然后凭借第二参数mode对文件修访问权限进行指定的修改,其上便是mode具有的宏和其作用。

2.

(1)open函数用来打开或创建一个文件(pathname为打开或创建的文件名,flags为宏定义,对应open函数的几种作用),比如打开文件时可以因flags的值来确定文件是只读还是只写或是读写均可。

          当flags使用O_CREAT则是创建一个文件,此时会用到mode,以说明文件的存取权限。   

                                      ××××××新文件的实际存取权限是mode和umask按照(mode & ~umask)运算之后的结果来确定新文件的访问权限。××××××

(2)create函数较为特殊,说是可打开且可创建文件,实际都是新建文件,creat函数中pathname指向的文件若不存在则创建一个新文件,若指向的文件存在则用新文件覆盖旧文件。实际两则都相当与创建了一个新文件,所以无论怎样操作creat函数打开的文件中并没有数,所以×××creat只能以只写模式打开文件×××。且其创建函数的实际权限与open相同。

(3)

         close用来关闭一个 已经打开的文件,该文件由文件描述符fd决定。

3.文件的读写

(1)

          read函数用来从打开的文件中读取数据,文件描述符fd得到后,对相应的文件进行读取,读取count个字节的数据到buf中。read返回实际读取字节的大小(可以此作为判断条件)。

(2)

看参数就知道,write只是用来从打开的文件中写如数据,将count个字节的buf中的数据写入fd指向的文件中。

4.  

lseek可以用来移动文件读写指针的位置。

SEEEK_SET,SEEK_CUR,SEEK_END分别是从文件开始处,文件当前位置和文件结尾处开始计算偏移量。

lseek(int fildes,0,SEEK_SET)     将文件读写指针移动到文件开始处

lseek(int fildes,0,SEEK_END)    将文件读写指针移动到文件结尾处

lseek(int fildes,0,SEEK_CUR)    获取文件读写指针当前位置(相对文件开头的偏移)

5.

   dup和dup2都用来复制oldfd指向的文件描述符。

   dup返回最小的未被使用的文件描述符,返回的文件描述符和oldfd指向同一个文件。(共享所有的锁定,读写指针和各项权限或标志位)。

   dup2则是以newfd代替dup中的最小未被使用的文件描述符。若newfd由指向则先释放其指向的文件在进行操作。

6. 

     fcntl可以用来对已打开的文件操作符进行各种控制操作以及改变已打开的文件的各种属性。

     F_SETFL对已打开的文件进行操作,将其设置为第三个参数arg指定的打开方式(只包含O_APPEND,O_NONBLOCK,O_ASYNC)。

     F_GETFL可以获得文件的打开方式,以标志值的方式返回。

    (标志值与文件权限的r=4,w=2,x=1有相似)。

fcntl还可做文件锁作用

     若作文件锁则第三个参数指向struct  flock  *lock

      了l_type用来设置读锁(F_RDLCK)和写锁(F_WRLCK)。写锁只可单独使用,若有写锁则不可在加写锁或读锁,若有读锁则可继续加读锁但不可添加写锁。

       F_SETLK,当设置读锁时fd指向的文件必须以可读方式打开,当设置写锁时必须以可写方式打开,当设置两种锁时必须以可读可写方式打开。

       F_SETLKW  与F_SETLK功能类似,当不同的锁因为其他的锁被阻止时,会等待相冲突的锁被释放。

7.   

       这三个函数都是为了获得文件的详细信息储存在结构体buf中,不同的是stat和lstat以文件名访问,fstat以文件描述符访问。

        stat和lstat的区别是,假设有一快捷方式,stat读取的是快捷方式指向的文件的本身状态信息,而lstat旧读取快捷方式本身的文件状态信息。

8.    设置文件属性

(1)

          此三个函数的区别与上述三个函数的区别相同。

          chown会将path指向的文件所有者id更改为参数owner代表的用户id,将文件所有者的组id改变为group代表的id。

          (文件的所有者只能改变文件的组id为其所属组中的一个,超级用户才可以随意修改id)

(2)

          truncate函数将path指向的文件大小修改为参数length指定的大小。若length大于原本的文件则会扩展文件大小,在扩展的区域用0填满。若length小于原本文件的大小,则超出的部分会被删除。

(3)

          

           utime用于改变热和文件的存取时间和修改时间。若buf是一个空指针,则改变其存取时间和修改时间为当前时间。若buf不为空,则改变其时间为buf中的值。

(4)

          umask函数可以修改进程的umask{新文件的实际存取权限是mode和umask按照(mode & ~umask)运算之后的结果来确定新文件的访问权限}    就是修改大括号中的umask的值。

9.文件的删除和移动

(1)

          rename会将参数中oldpath所指定的文件名改为参数newpath指定的文件名,也可以写为详细地址,若地址不同则会移动文件,改名和移动文件可以通过该函数一次性完成。

(2)

          unlink可以实现对文件的删除,但是只删除文件本身,并不会对其链接的文件进行删除。

10.目录操作

(1)

          mkdir创建一个目录,pathname威信件目录的目录名,mode(mode & ~umask)为其权限。

(2)

          rmdir删除目录。

(3)

          getcwd函数可以将当前工作目录的绝对路径复制到buf参数中。

(4)

          chdir函数将当前工作目录改变为path指定的目录。chdir只影响调用该函数的进程,对于其他进程则修改不了。(不能随意切换工作目录)

(5)

          opendir用来代开参数name指向的目录,并返回DIR*型的目录流,类似于文件描述符。

(6)

         

           readdir用来从参数dir所指向的目录中读取目录项信息,函数执行成功返回下一个文件的信息,若目录中文件已全部被访问过则返回NULL。

(7)

          closedir用来关闭参数dir指向的目录。

### 文件系统模拟实验总结 #### 对文件系统基本结构的理解 在完成文件系统模拟实验的过程中,深入理解了文件系统的基本结构及其管理方式。通过对文件、目录、文件描述符、节点和位图等组件的操作,获得了对这些元素如何协同工作的直观认识[^1]。 #### 掌握文件系统的管理方法 通过实际创建和管理文件与目录,进一步熟悉了文件系统的构成要素及运作机制。这不仅加深了对于理论概念的认知,还提高了实践技能,在具体环境中运用所学知识的能力得到了提升。 #### 学习到的具体技术细节 - **两级文件目录的应用**:了解并实现了基于两级索引表的文件定位算法,使得能够高效地访问磁盘上的任意位置的数据块。 - **文件分配策略**:研究了几种常见的文件空间分配方案(如连续分配、链式分配),并通过编程实现了一个简单的动态分区存储管理系统。 - **元数据处理**:学习到了超级块、i-node等重要元数据的作用,并编写程序来管理和更新它们的信息。 ```python class FileSystemSimulator: def __init__(self): self.files = {} def create_file(self, filename, content=""): if filename not in self.files: self.files[filename] = {"content": content} print(f"{filename} created.") else: print("File already exists.") def read_file(self, filename): if filename in self.files: return self.files[filename]["content"] else: raise FileNotFoundError(f"No such file named {filename}") # Example usage of the simulator class simulator = FileSystemSimulator() simulator.create_file('example.txt', 'This is an example.') print(simulator.read_file('example.txt')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值