共识原理:
1.文件=属性+内容。
2.文件分为打开文件和未打开文件。
3.打开的文件:进程打开。
4.未打开的文件:在磁盘里存放着。
5.文件打开,必须先被加载到内存。
6.一个进程可以打开多个文件,那么操作系统就必须先描述再组织的对文件进行管理。
一.C语音文件操作
1.fopen
fopen打开的文件如果不存在则会在当前路径下创建一个该文件,当前路径指的是进程路径。
那么同理如果我更改了当前路径的工作目录,我就可以把文件建立到新的路径里。
2.fwrite
这里不加1似乎并没有问题,接下来将写入的文件内容改一改。
插入一个额外的问题
似乎也没有问题。那么问题是原来的数据怎么不见了,只剩下了abcd了呢?
根据文档解释,fopen用w写入时每次都从开头写入,并且每次都会把文件进行清空处理。
回到原来的问题
后面出现了一个乱码,这是/0,因为/0不能被看到,所以被vim翻译成了乱码。那么究竟需不需要写/0呢?其实是不需要的,因为字符串以/0结尾是c语言的规定,跟文件没有关系。
3.fopen以a方式打开
a其实就是不断追加。
二.Linux下一切皆文件
在创建一个C程序时,它会默认打开三个文件:stdin,stdout,stderror。
当我们想要读取或者打印时,可以直接向这些文件流里写入即可。
例如:之前我们向log.txt文件里写入信息,也可以向stdout文件里写入信息。
当然更常用的fprintf
可以看出对于Linux来说无论是对log.txt文件里写入,还是向显示器写入都没有区别。
三.系统调用接口
众所周知文件是被存在磁盘里的,而用户想要操作硬件就必须经过操作系统,操作系统就必须提供对应的接口来供用户使用,那么可以得出c语言的标准文件例如printf之类也必定封装了系统调用接口,下面来介绍一些系统调用接口。
第一个参数要打开的文件名,第二个是打开的模式,第三个是创建文件时指定的文件权限。第一个接口一般用来打开已经存在的文件,第二个一般用来创建新文件。
这与C语言所封装后的不同,使用O_WRONLY并不会新建文件,一旦找不到文件就是打开失败了。
接下来使用第三个参数,想要创建一个权限为666的文件
注意,这里必须要把掩码置为0,不然权限会与掩码相结合得出最终的权限。
关闭文件
写入内容
接下来做一个与上文一样的实验
我们可以发现它原本的内容依旧是被保留了下来。如果我们想要和fopen的w模式一样,每次写时将内容清空该如何做呢?那我们应该再加一个擦参数O_TRUNC。
总结
四.文件描述符-fd
每打开一个文件,就必定有一个结构体去维护这个文件(struct file)。而一个进程可以打开多个文件,那么这多个文件的管理结构体就会组成一个struct files_struct结构体,这个结构体里有一个数组(struct file*fd_array[]),存放着打开文件的结构体的指针,而这个数组的下标就被称为fd,所以open的返回值就是数组的下标。而这个结构体的指针存放在PCB里,这样该进程就能通过PCB管理这些文件了。
** Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2。0,1,2对应的物理设备一般是:键盘,显示器,显示器**
所以我们可以直接通过0,1进行输入输出
文章来源:https://www.toymoban.com/news/detail-741434.html
这里从键盘上读入字符,用printf显示出来。可以看到是可以成功的,这里我们并没有打开这个文件,却依旧能写入,说明这三个文件默认打开其实是操作系统的特性。文章来源地址https://www.toymoban.com/news/detail-741434.html
到了这里,关于【Linux】:基础IO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!