1.C语言中的文件操作函数
文件的打开
代码演示:
此时,当前目录中并没有log.txt文件,但是没关系,fopen会在当前路径下创建log.txt文件。
下面来验证一下:
注∶使用fopen时,填写mode参数,单纯以w方式打开文件,会自动清空文件原有的数据。r+(读写)代表文件不存在则出错, w+(读写)代表文件不存在则创建。(带有+的表示读写)。a代表向文件中追加内容。
打开文件方式的总结:
文件的关闭
C语言中的其它读写文件函数
2.系统文件IO操作函数
1.open
RETURN VALUE
flag如何传递多个选项,是通过比特位来传递选项的。
代码演示:
因此,我们可以使用|(或)来帮助我们传递多个参数,以此实现不同的功能。
mode参数
如果你使用O_CREAT参数创建一个新的文件,那么你还可以通过第三个参数mode来设置该文件的权限。
2.close
3.read
4.write
3.文件描述符fd
文件描述符的引入
代码演示:
运行结果:
fd是一个整数,我们发现,结果是从3开始的,为什么是从3开始的呢?
代码验证:
结果如下:
对fd的理解
进程要访问文件,必须先打开文件,一个进程可以同时打开多个文件,操作系统中有大量的进程,也就是说操作系统要同时打开大量的文件,操作系统要对这些打开的文件进行管理,方式:先描述,再组织。
上边,我们发现fd是从0,1,2,3,4,.........
我们在哪里将从0开始的连续增长的整数--------数组下标。
其实,文件描述符的本质就是数组下标。
对应的内核部分代码:
4.文件描述符的分配规则
代码演示:
如果先关闭了0号文件描述符呢?
结论:
5.重定向
重定向的原理
(以输出重定向为例)
输出重定向的本质:
重定向对应的系统调用
dup2
代码演示:
结果:
关于dup2(int oldfd,int newfd)两个参数的填写
以上边的代码为例,目的是将本该打印到显示器的内容显示到log.txt文件中,结合对文件描述符的理解(文件描述符就是数组下标,struct file* fd_array[]数组内填写的是struct file对象的地址),再结合2号手册
我们不难理解到,我们是要把地址为fd对应的struct file地址拷贝到地址为1对应的位置,所以,要重定向的目标文件描述符在后(newfd), 要进行重定向的文件描述符在前(oldfd)。
6.理解Linux下一切皆文件
底层不同的硬件,一定对应不同的操作方法,但是OS管理这些底层硬件,使用统一的结构来进行管理的,在OS视角,底层硬件没有任何区别。