文章目录
一、文件管理引入
我们在前面的文章中就曾提及过,进程操作的本质:进程与被打开文件的关系
。
那么问题来了,一个进程可以打开多个文件吗?
可以 -> 系统中一定会存在大量被打开的文件 -> 被打开的文件需不需要被 OS管理起来呢?要的 -> 如何管理? -> 先描述,在组织 -> 操作系统为了管理对应的打开文件,必定要为文件创建对应的 内核数据结构标识文件 -> files_struct {} -> 包含了大量的文件属性
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#define FILE_NAME(number) "log.txt"#number //宏中+#,使两个字符串具有链接特性
int main()
{
umask(0);//设置当前进程的umask值
int fd0 = open(FILE_NAME(1), O_WRONLY | O_CREAT | O_APPEND, 0666);
int fd1 = open(FILE_NAME(2), O_WRONLY | O_CREAT | O_APPEND, 0666);
int fd2 = open(FILE_NAME(3), O_WRONLY | O_CREAT | O_APPEND, 0666);
int fd3 = open(FILE_NAME(4), O_WRONLY | O_CREAT | O_APPEND, 0666);
int fd4 = open(FILE_NAME(5), O_WRONLY | O_CREAT | O_APPEND, 0666);
printf("fd: %d\n", fd0);
printf("fd: %d\n", fd1);
printf("fd: %d\n", fd2);
printf("fd: %d\n", fd3);
printf("fd: %d\n", fd4);
close(fd0);
close(fd1);
close(fd2);
close(fd3);
close(fd4);
}
通过观察上面的代码和对应的运行结果,我们发现了两个问题:
- fd获取的是文件操作符,那么为什么文件操作符是从3开始的呢?
- 为什么文件操作符是连续的小整数呢,这些连续的小整数是什么?
其实,这些连续的小整数就是数组的下标,至于为什么是数组下标,我们在后面结合其他知识再行讲解。
二、理解文件描述符
我们还是以 open的代码为例,我们知道,open接口调用成功后会返回文件描述符。实际上,文件描述符,就是一个整数
。
int fd = open(FILE_NAME, O_WRONLY | O_CREAT | O_TRUNC, 0666);
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入(stdin)0, 标准输出(stdout)1, 标准错误(stderr)2。0,1,2对应的物理设备一般是:键盘,显示器,显示器。也就是说,在操作系统层面,我们可以把键盘和显示器理解成为文件
。
这就回答了我们上面的第一个问题:fd获取的是文件操作符,那么为什么文件操作符是从3开始的呢?
因为前三个文件描述符被占用了。下面ÿ