文件闲谈
谈谈我为什么有文件这几篇文章的(自己的作死之路)-_-
0
最开始是写 Go 语言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 func OpenFile(name string, flag int, perm FileMode) (*File, error)
name: 文件路径
flag: 控制文件的打开方式
perm: 控制文件模式
可用的打开方式:
O_RDONLY: 只读
O_WRONLY: 只写
O_RDWR: 可读可写
O_APPEND: 追加内容
O_CREATE: 创建文件,如果文件不存在
O_EXCL: 与创建文件一同使用,文件必须存在
O_SYNC: 打开一个同步的文件流
O_TRUNC: 打开时截断常规可写文件
打开模式:
// The defined file mode bits are the most significant bits of the FileMode.
// The nine least-significant bits are the standard Unix rwxrwxrwx permissions.
// The values of these bits should be considered part of the public API and
// may be used in wire protocols or disk representations: they must not be
// changed, although new bits might be added.
const (
// The single letters are the abbreviations
// used by the String method's formatting.
// 文件夹模式
ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
// 追加模式
ModeAppend // a: append-only
// 单独使用
ModeExclusive // l: exclusive use
// 临时文件
ModeTemporary // T: temporary file; Plan 9 only
// 象征性的关联
ModeSymlink // L: symbolic link
// 设备文件
ModeDevice // D: device file
// 命名管道
ModeNamedPipe // p: named pipe (FIFO)
// Unix 主机 socket
ModeSocket // S: Unix domain socket
// 设置uid
ModeSetuid // u: setuid
// 设置gid
ModeSetgid // g: setgid
// UNIX 字符串设备,当设备模式是设置unix
ModeCharDevice // c: Unix character device, when ModeDevice is set
// 粘性的
ModeSticky // t: sticky
// 非常规文件;对该文件一无所知
ModeIrregular // ?: non-regular file; nothing else is known about this file
// bit位遮盖,不变的文件设置为none
// Mask for the type bits. For regular files, none will be set.
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice | ModeCharDevice | ModeIrregular
// 权限位
ModePerm FileMode = 0777 // Unix permission bits
)
发现对于 flag,perm 这几个参数不太理解,随后就想找一下这几个参数的出处
1
后面发现 Go 语言和 C 语言有点相似,然后就去重新学了 C,C 语言只是语法基础,要想运用还是需要熟悉基本的 API(这里不知道怎么称呼,我刚开始是 Java 出身的),然后就找到了 <<Unix 高级环境编程>>,发现了这几个参数的详细解释
1 | int open(const char *path, int oflag, .../* moode_t mode*/); |
2
它返回的参数是一个 int,称之为文件描述符,一脸懵逼,后面就有了 fd 那篇文章。
3
学着学着又引出一个概念,inode,后面有了文件系统那篇文章
###
随后就有了磁盘,分区那篇文章
总结
- open 一个文件返回一个 int,称之为文件描述符,文件描述符就是数组的下标
- 一个进程中包含了一个打开文件的数组,每个元素是文件的结构体,通过返回的 fd 可以找到对应的文件结构体
- 文件结构体中有一个 inode 结构,inode 结构保存了数据的真实位置
- 一个磁盘可以被分区,每个分区都有自己的文件系统,文件系统里面包含有 inode 结构
- 分区需要 mount 才能被访问