文件IO-复习-self

文件IO首先要了解的是不带缓存的IO,最常见的是open\read\write\lseek\close,其次还有creat

文件描述符

  • 进程创建的时候会自动打开三个文件描述符,标准输入、输出、错误。
  • 创建文件的时候,内核会返回一个非负整数,作为文件描述符返回给调用函数,操作文件描述符,就是操作文件本身。

open

open函数,第一个参数是需要打开的文件名字的路径,第二个参数是flags,文件的打开方式,常用的有只读、只写,可读可写,打开清空等,第三个参数是mode_t,指明文件的所有权限,所有关于文件的返回值,和文件描述符相似,成功是非负,-1是失败。常用书写习惯。

close

输入参数只要是文件描述符,返回值检查是否是非负数。

read

返回值类型时ssize_t,long int。第一个参数是文件描述符,第二个参数是内存地址,是一个指针,可以用出租初始化内存空间,空间大小+1,可以手动添加'\0',用作打印输出的结尾。第三个参数是需要读取的字节数,也就是长度,一般需要读取的长度和返回值的长度是一致的,如果小于需要读取的长度,很有可能是读到文件末尾,0表示文件末尾。

write

和read比较类似,返回值也是写入的字节数,第一个参数是文件描述符,第二个参数是内存地址,也就是字符串保存的地址,第三个参数是写入的字节数。-1表示失败,写入完成也不一定是真的写入,系统会做IO缓存,提高系统的运行效率。或者磁盘已满也会造成写入失败。

lseek

第一个参数是文件描述符,第二个参数是对应相对位置后的偏移量,第三个参数是对应文件偏移的相对位置,文件头部、当前位置和末尾。

mmap

  • 文件内存映射和虚拟缓存的区别在于,文件内存映射操作的是物理内存,虚拟缓存作用于虚拟内存。
  • 实际过程中,虚拟缓存swap是指在程序在运行过程中缓存在物理内存是有限的,所以需要将不常用的缓存程序由内存写入磁盘的swap虚拟缓存交换区,这样可以释放内存空间,当写入磁盘缓存区的程序被唤醒时,由磁盘虚拟缓存区再写入物理内存区。
  • mmap内存映射的工作原理是,文件是通过页内存中转实现的,常用的read、write函数是需要从页缓存写入函数指定的内存区域,而mmap是直接对页缓存进行内存映射,直接对映射区进行指针操作就可以实现对文件页缓存的操作,从而实现操作文件的目的。
  • 在使用read、write函数的时候,函数是系统调用,需要在内核态下读取文件内容到内核空间,然后转入用户空间将内核空间的数据复制到用户空间,需要读写两次文件内容。
  • mmap是系统调用,返回的是一个指针。将进程的虚拟地址空间和文件在磁盘上的内存空间空间做映射。mmap是直接将文件映射到用户空间,没有经历内核空间,这样省去了一次内核复制。
  • void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);mmap函数的第一个参数是需要操作的文件地址,第二个参数是文件的长度,第三个参数是映射区域的保护方式,第四个参数是影响映射区域的特性,是共享数据还是私有数据。
posted @   steve的miao  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示