目录
一、认识 open 函数
1.1 理解文件
1.2 open 函数
1.3 函数选项和宏
二、 open 函数的返回值
三、 fd 的本质
3.1 各部分内容及关系
3.2 如何确定进程对应文件
四、Linux 一切皆文件?
一、认识 open 函数
在C语言中学习文件操作时,我们学过的诸如: fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。但是从语言层面上,我们是无法完全理解文件的,必须要从操作系统层面来看文件!!
以后学习的如 open close read write lseek 都属于系统提供的接口,称之为系统调用接口
1.1 理解文件
在操作系统中,我们操作文件,本质上是进程在操作文件!所以我们学的是进程与文件的关系!
文件默认在磁盘中,而磁盘属于外设,它是计算机的硬件部分。所以我们向文件中写入,本质是我们在向硬件写入!但是用户没有权利向硬件写入呀,操作系统才是硬件的管理者,我们不可以绕过操作系统去管理硬件!我们只能通过操作系统向硬件写入,这就要求操作系统提供系统调用!而在C语言中使用的 fopen fclose fread fwrite 等函数,都是对系统调用的封装!我们在这里学习的目标就是使用系统调用来进行文件操作!
1.2 open 函数
我们先来复习一下C语言中学过的文件操作,fopen:
那么如何使用系统调用实现上述功能呢?
我们使用 man 2 open 查一下手册,找到几个命令,
这样我们就可以实现像库函数一样的命令!其中open的选项使用 man 都可以查到。
但是我们查看 log.txt 时,看到他的权限好像并不是我们想要的读写权限,这是为什么呢?
其实这里又要牵扯到我们之前讲到的权限掩码 umask !
umask 也可以用 man 2 umask 查到相关用处哦
1.3 函数选项和宏
你是否有个疑惑,我们的函数是如何通过传进来的选项来进行相关的操作的呢?
其实我们的选项不过是系统给我们设置的宏参数而已。
这样一来,是不是觉得系统调用的传参也不是什么稀奇的事情!
二、 open 函数的返回值
各位有没有注意到,为什么我们库函数返回的是 [FILE *] ,而系统调用返回的却是 [int] 呢?
我们新建几个文件来看看 open 的返回值到底是什么,或者说到底有什么规律?
这里只是演示一下,但是不管新建多少次,我们的返回值总是从 3 开始的,那 0 1 2 去哪里了?
先说结论:
0 代表标准输入 —— 键盘1 代表标准输出 —— 显示器
2 代表标准错误 —— 显示器
这些都叫做文件描述符 fd ,那么为什么我们只需要 fd 就可以向指定的位置读写了呢? fd 的本质是什么呢?
三、 fd 的本质
3.1 各部分内容及关系
3.2 如何确定进程对应文件
四、Linux 一切皆文件?
像我们上面理解的那般,那 fd == 0 1 2 时,我们的硬件也变成文件了?我们要怎么理解我们的键盘、显示器在 Linux 中都成为文件了呢?