个人主页:Lei宝啊?
愿所有美好如期而遇
--> 答案是占据磁盘空间的,文件 = 文件内容 + 文件属性
--> 文件内容我们都知道也就不多提,而文件的属性也就是权限,所属组,文件大小等等,我们可以对他做出修改,详情请参考:Linux权限理解
首先,文件是在磁盘上存储,我们写代码去访问,代码经过编译,链接后成为可执行程序,可执行程序运行,在内存中创建PCB后加载进内存变成进程,所以,我们访问文件本质是进程在访问,而不是我们的exe文件。
那么,我们要想向文件做写入,而文件是存在磁盘上的,也就是说我们要向磁盘做写入,磁盘是硬件,只有操作系统有权限向磁盘做写入,而我们作为普通用户,也想向文件做写入怎么办呢?所以操作系统为普通用户提供了文件类的系统接口,我们可以通过这些接口向文件做写入。
那么我用C语言向文件做写入的时候为什么没听过什么系统接口呢?我直接使用C语言标准库提供的fopen等等不是能够很好的访问文件吗?
首先,因为系统接口使用起来确实有难度,在学C语言期间介绍使用系统接口,那么还得了解系统和权限,了解其他周边知识,成本比较高,所以直接使用C标准库提供的函数,一是简单,成本低,二是可以跨平台。
那么为什么说可以跨平台呢?不同平台提供的系统接口是不同的,Linux下我们如果使用系统接口,那么这份代码除了Linux平台可以跑,其他平台都用不了,那么为什么使用标准库提供的接口就可以跨平台了呢?这是因为C标准库把各个平台的系统接口全作了封装,他把各个平台的代码都实现了一遍,然后通过条件编译,动态裁剪,所以我们不用在乎是哪个平台,也就实现了可移植和跨平台性。
再一个,我们现在又为什么要学习系统接口呢?现在几乎所有的语言都对不同平台的系统接口作了封装,在Linux下,java,C++,C等语言都对Linux系统接口作了封装,但是呢,他们封装的接口都是同一套接口,因为都是在Linux下,而Linux操作系统只有一套,也就是说,我们学习了Linux的系统接口,所有语言在Linux下的底层我们都能够看的懂。
printf向显示器打印,我们使用起来似乎顺利成章,感觉很正常,但是你说向磁盘文件作写入,老是感觉很别扭,这是因为我们向显示器打印,我们可以看得到,而向磁盘文件写入,我们不能立即看到结果,所以就会感到别扭。
但是printf向显示器作写入和向磁盘文件作写入是没有本质区别的,都是向文件写入,因为在Linux下,一切皆文件!
站在我们曾经程序的角度上,我们理解的文件就是读和写,read和write,我们的显示器,也就是printf和cout,我们的键盘,也就是scanf和cin。
当我们的程序加载进内存,使用键盘读取(read)数据进内存,内存就会将这些数据给我们的代码一份,同时给显示器一份,键盘的读取也就是input操作,而内存的操作就是output,这也解释了我们的stdio.h头文件,std是standard的简写,也就是标准,io也就是输入输出。
那么站在系统的角度上,什么叫做文件呢?站在系统的角度上,能够被读取和输出的设备就叫做文件!狭义上的文件,也就是我们的磁盘文件,而广义上的文件,包括磁盘,网卡,键盘,显示器,显卡,几乎所有外设,都可以称之为文件。
可以向键盘写入吗?或者说从显示器读取数据?不可以,他们这两个方法都被设置为了NULL。