1、API
(1)基于linux做应用开发,其实就是通过调用linux系统提供的API来实现。
(2)API 是一些由linux系统提供的函数,给应用层使用,以完成一定的功能。
(3)常用的文件IO的API 有open,close,write,read,lseek等。
2、文件描述符(fd)
文件描述符的本质
文件描述符本质就是一些非负整数,它是进程表中文件描述符表的一个表项,用来表示以及区分一个程序打开的多个文件。进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表。
换言之,文件描述符表是个数组,fd是index,文件表指针是value。
文件描述符的作用域
文件描述符的作用域是当前进程,不同进程下打开的文件的文件描述符可以是相同的数字。
其他描述
(1)文件描述符,是open系统调用时内部由操作系统自动分配的,它会从文件描述符表中挑选一个最小的未被使用的数字返回。
(2)其中0、1、2已经被stdin、stdout、stderr这3个文件占用。当运行一个程序时,默认打开上述三个文件,即把键盘、屏幕、标准错误当做文件。
(3)printf函数默认输出到标准输出stdout上,而fpirntf函数可以指定输出到哪个文件描述符中。
3、文件IO和标准IO的异同
两者的概念
文件IO,即使用open、close、write、read等API函数构成的一套用来读写文件的体系。这套体系可以很好的完成文件读写,但是效率并不是最高的。
标准IO,是一套由C库函数提供文件操作函数来完成文件读写的体系。标准IO由一系列的C库函数(fopen、fclose、fwrite、fread)构成,这些标准IO函数其实是由文件IO封装而来的(fopen内部其实调用的还是open,fwrite内部还是通过write来完成文件写入的)。
标准IO加了封装之后主要是为了在应用层添加一个缓冲机制。我们通过fwrite写入的内容不再直接进入内核中的buf,而是先进入应用层标准IO库维护的buf中,然后标准IO库根据操作系统单次write的最佳count来选择好的时机,将内容write到内核中的buf。然后内核中的buf再根据硬盘的特性来选择好的时机去最终写入硬盘中。
文件IO的API和标准IO的库函数
(1)文件IO的API有open,close,write,read,lseek,dup,dup2,fcntl等等。
(2)标准IO的库函数有fopen、fclose、fwrite、fread、ffulsh、fseek等。
文件IO和标准IO的异同
(1)都是使用函数,但标准IO是C库函数,文件IO是Linux系统提供的API;
(2)C库函数由API封装而来,但是C库函数因为多了一层封装,比API要好用一些。
(3)C库函数具有移植性,而API是针对具体的系统设计的,不同操作系统之间不能通用。
(4)标准IO带有缓存,而文件IO没有缓存。
4、man手册的查询
(1)man 1 xxx 查询linux的shell命令
(2)man 2 xxx 查询API
(3)man 3 xxx 查询库函数
5、退出进程
打开文件时如果出错,后面的操作就不应该继续进行。
有两种方法退出进程:
(2)在main中用return,正常return 0,异常return -1。
(3)典型的终止进程应该用exit、_exit、_Exit之一。前者是库函数,后二者是系统API。
6、文件重定位
可以把向屏幕输出的内容,输出到某个文件。