【Linux】:基础IO

基础IO

  • 一.C语音文件操作
    • 1.fopen
    • 2.fwrite
    • 3.fopen以a方式打开
  • 二.Linux下一切皆文件
  • 三.系统调用接口
  • 四.文件描述符-fd

共识原理:

1.文件=属性+内容。
2.文件分为打开文件和未打开文件。
3.打开的文件:进程打开。
4.未打开的文件:在磁盘里存放着。
5.文件打开,必须先被加载到内存。
6.一个进程可以打开多个文件,那么操作系统就必须先描述再组织的对文件进行管理。

一.C语音文件操作

1.fopen

【Linux】:基础IO_第1张图片

fopen打开的文件如果不存在则会在当前路径下创建一个该文件,当前路径指的是进程路径。

在这里插入图片描述

那么同理如果我更改了当前路径的工作目录,我就可以把文件建立到新的路径里。

【Linux】:基础IO_第2张图片

【Linux】:基础IO_第3张图片
【Linux】:基础IO_第4张图片

2.fwrite

【Linux】:基础IO_第5张图片

【Linux】:基础IO_第6张图片

【Linux】:基础IO_第7张图片

这里不加1似乎并没有问题,接下来将写入的文件内容改一改。

在这里插入图片描述

在这里插入图片描述

插入一个额外的问题

似乎也没有问题。那么问题是原来的数据怎么不见了,只剩下了abcd了呢?

在这里插入图片描述

根据文档解释,fopen用w写入时每次都从开头写入,并且每次都会把文件进行清空处理。

回到原来的问题

在这里插入图片描述

在这里插入图片描述

后面出现了一个乱码,这是/0,因为/0不能被看到,所以被vim翻译成了乱码。那么究竟需不需要写/0呢?其实是不需要的,因为字符串以/0结尾是c语言的规定,跟文件没有关系。

3.fopen以a方式打开

在这里插入图片描述

【Linux】:基础IO_第8张图片

【Linux】:基础IO_第9张图片

a其实就是不断追加。

二.Linux下一切皆文件

在创建一个C程序时,它会默认打开三个文件:stdin,stdout,stderror。

【Linux】:基础IO_第10张图片

当我们想要读取或者打印时,可以直接向这些文件流里写入即可。

例如:之前我们向log.txt文件里写入信息,也可以向stdout文件里写入信息。

在这里插入图片描述

在这里插入图片描述

当然更常用的fprintf

在这里插入图片描述

在这里插入图片描述

可以看出对于Linux来说无论是对log.txt文件里写入,还是向显示器写入都没有区别。

三.系统调用接口

众所周知文件是被存在磁盘里的,而用户想要操作硬件就必须经过操作系统,操作系统就必须提供对应的接口来供用户使用,那么可以得出c语言的标准文件例如printf之类也必定封装了系统调用接口,下面来介绍一些系统调用接口。

【Linux】:基础IO_第11张图片

第一个参数要打开的文件名,第二个是打开的模式,第三个是创建文件时指定的文件权限。第一个接口一般用来打开已经存在的文件,第二个一般用来创建新文件。

【Linux】:基础IO_第12张图片在这里插入图片描述

【Linux】:基础IO_第13张图片
在这里插入图片描述

这与C语言所封装后的不同,使用O_WRONLY并不会新建文件,一旦找不到文件就是打开失败了。

接下来使用第三个参数,想要创建一个权限为666的文件

【Linux】:基础IO_第14张图片

注意,这里必须要把掩码置为0,不然权限会与掩码相结合得出最终的权限。

关闭文件

【Linux】:基础IO_第15张图片

写入内容

【Linux】:基础IO_第16张图片

【Linux】:基础IO_第17张图片
在这里插入图片描述

接下来做一个与上文一样的实验

在这里插入图片描述

在这里插入图片描述

我们可以发现它原本的内容依旧是被保留了下来。如果我们想要和fopen的w模式一样,每次写时将内容清空该如何做呢?那我们应该再加一个擦参数O_TRUNC。

【Linux】:基础IO_第18张图片

总结

【Linux】:基础IO_第19张图片

【Linux】:基础IO_第20张图片

四.文件描述符-fd

每打开一个文件,就必定有一个结构体去维护这个文件(struct file)。而一个进程可以打开多个文件,那么这多个文件的管理结构体就会组成一个struct files_struct结构体,这个结构体里有一个数组(struct file*fd_array[]),存放着打开文件的结构体的指针,而这个数组的下标就被称为fd,所以open的返回值就是数组的下标。而这个结构体的指针存放在PCB里,这样该进程就能通过PCB管理这些文件了。

【Linux】:基础IO_第21张图片

** Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2。0,1,2对应的物理设备一般是:键盘,显示器,显示器**

所以我们可以直接通过0,1进行输入输出

【Linux】:基础IO_第22张图片

在这里插入图片描述

这里从键盘上读入字符,用printf显示出来。可以看到是可以成功的,这里我们并没有打开这个文件,却依旧能写入,说明这三个文件默认打开其实是操作系统的特性。

你可能感兴趣的:(Linux系统,linux,运维,服务器)