内容源于朱友鹏老师的课程笔记的学习整理,如有侵权,请告知删除。
一、linux中如何管理文件
(1)硬盘中的静态文件和iNode(i节点)
内容管理表 + 真正存储的内容;
内容管理表以文件为单位进行管理,每个文件一个结构体(即iNode);
平常说的快速格式化,其实就是把内容管理表删除,真正的内容没有被删除。
(2)内存中的动态文件和vnode(v节点)
每个进程都有一个数据结构(叫进程信息表),记录了该进程的所有信息;
进程信息表中有一个指针指向一个文件管理表(叫文件描述符表);
文件描述符表记录了当前进程打开的所有的文件及其信息,即文件描述符与文件表指针。文件描述符相当于数组下标,数组的值是文件表指针。
其中文件表指针指向了文件表,文件表中包含V节点指针、当前文件位移量(即文件指针所处的位置;在动态文件中,文件指针表示当前在文件流的哪个位置)。
如图:
二、一些概念
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对文件操作的影响。