Linux文件IO(文件的读写)

时间:2022-09-04 19:36:19

内容源于朱友鹏老师的课程笔记的学习整理,如有侵权,请告知删除。


一、linux中如何管理文件

(1)硬盘中的静态文件和iNode(i节点)

  • 内容管理表 + 真正存储的内容;
  • 内容管理表以文件为单位进行管理,每个文件一个结构体(即iNode);
  • 平常说的快速格式化,其实就是把内容管理表删除,真正的内容没有被删除。

(2)内存中的动态文件和vnode(v节点)

  • 每个进程都有一个数据结构(叫进程信息表),记录了该进程的所有信息;
  • 进程信息表中有一个指针指向一个文件管理表(叫文件描述符表);
  • 文件描述符表记录了当前进程打开的所有的文件及其信息,即文件描述符与文件表指针。文件描述符相当于数组下标,数组的值是文件表指针。
  • 其中文件表指针指向了文件表,文件表中包含V节点指针、当前文件位移量(即文件指针所处的位置;在动态文件中,文件指针表示当前在文件流的哪个位置)。
  • 如图:
Linux文件IO(文件的读写)


二、一些概念

  • API 的一些概念

(1)基于linux做应用开发,其实就是通过调用linux系统提供的API来实现;

(2)API 是一些由linux系统提供的函数,给应用层使用,以完成一定的功能。

(3)常用的文件IO的API 有open,close,write,read,lseek等。


  • 文件描述符(fd)

(1)实质就是一些非负整数,用来区分一个程序打开的多个文件;

(2)作用域是当前进程,也就是说,不同进程下打开的文件的文件描述符可以是相同的数字;

(3)fd从0开始,依次增加。其中0,1,2已经被stdin,stdout,stderr这3个文件占用,也就是说,当运行一个程序时,默认打开了上述三个文件,即把键盘、屏幕当做文件。


  • 文件IO和标准IO的异同

(1)标准IO是C库函数,文件IO是系统提供的API;

(2)C库函数由API封装而来;

(3)C库函数具有移植性,而API是针对具体的系统设计的;

(4)标准IO带有缓存,而文件IO没有缓存。


  • man手册的查询

     man  1  xxx    查询linux的shell命令

     man  2  xxx    查询API

     man 3   xxx    查询库函数


  • 退出进程

(1)打开文件时如果就出错了,后面的操作就应该不再进行。如 _exit(-1)

(2)退出程序:在main中用return,正常return 0,异常return -1;典型的终止进程应该用exit,_exit,_Exit,后二者是系统API,前者是库函数。 


  • 文件的重定位(即把向屏幕输出的内容,输出到某个文件)

            fd1=open("文件名",flag) ;       

            close(1);

            fd2=dup(fd1);


三、常见的API

(1)常用文件IO的API 有open,close,write,read,lseek,dup,dup2,fcntl等,具体使用方法可以查看man手册;

(2)注意open里面的flag对文件操作的影响。