了解文件描述符之前,我们先整理一下这五个字
文件描述符就是:描述文件的符号,是对于文件的别名
#include <stdio.h>
#include <fcntl.h> // For open() flags
#include <unistd.h> // For syscalls like write(), close()
int main() {
int fd; // fd 就是文件描述符 (file descriptor)
// 1. 打开一个文件 "my_file.txt" 用于写入,如果不存在就创建
fd = open("my_file.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
perror("open"); // 如果打开失败,打印错误信息
return 1;
}
// 2. 使用文件描述符 fd 向文件写入 "Hello, world!\n"
const char *message = "Hello, world!\n";
write(fd, message, 14); // 14 是消息的长度
// 3. 关闭文件描述符 fd,表示操作完成
close(fd);
printf("写入完成!\n");
return 0;
}以write(fd, message, 14); // 14 是消息的长度为例,向描述符号为fd的文件写入长14的信息
更准确的理解应该是,文件是资源、文件描述符是资源的授权代号
文件描述符就像是 你专属的通行证号码,让你能告诉电脑你想操作哪个文件或设备。
想象一下你开了一家餐厅:
- 文件/设备 就像餐厅里的各种 食材、厨具、菜单 等等。
- 文件描述符 就像是给每样东西贴上的 编号标签。比如,1号标签代表烤箱,2号标签代表冰箱,3号标签代表今天的菜单。
- 进程 就像是你的 餐厅服务员。
进程如何使用文件描述符调用系统调用?
当你的服务员(进程)想操作烤箱(文件/设备)时,他们不会直接去搬烤箱,而是会拿着 烤箱的编号标签 (文件描述符) 去告诉厨房 (操作系统) 说: “我要用 1号标签 代表的烤箱,现在要把它 打开 (系统调用)!”。
操作系统 (厨房) 看到 1号标签,就知道服务员指的是烤箱,于是就执行 “打开烤箱” 的操作。
文件描述符的唯一性如何理解?
文件描述符在 你的餐厅 (进程) 里是唯一的。
- 每个服务员 (进程) 都有一套自己的标签。
- 即使两个服务员 (进程) 都想用烤箱,他们都用 “1号标签”,但这两个 “1号标签” 是属于他们各自的。 不会混淆,就像两个餐厅的 1号烤箱不会互相影响一样。
简单来说:
文件描述符就像你餐厅里每样东西的 专属编号,保证每个服务员(进程)都能准确地告诉厨房(操作系统)他们想操作什么,而且 每个餐厅 (进程) 的编号都是独立的,不会互相干扰。
最简单的代码调用实例 (C 语言):
#include <stdio.h> #include <fcntl.h> // For open() flags #include <unistd.h> // For syscalls like write(), close() int main() { int fd; // fd 就是文件描述符 (file descriptor) // 1. 打开一个文件 "my_file.txt" 用于写入,如果不存在就创建 fd = open("my_file.txt", O_WRONLY | O_CREAT, 0644); if (fd == -1) { perror("open"); // 如果打开失败,打印错误信息 return 1; } // 2. 使用文件描述符 fd 向文件写入 "Hello, world!\n" const char *message = "Hello, world!\n"; write(fd, message, 14); // 14 是消息的长度 // 3. 关闭文件描述符 fd,表示操作完成 close(fd); printf("写入完成!\n"); return 0; }代码解释:
int fd;: 声明一个整数变量fd,用来存放文件描述符。fd = open("my_file.txt", O_WRONLY | O_CREAT, 0644);:
open()是系统调用,请求操作系统打开或创建文件 “my_file.txt”。"my_file.txt": 文件名。O_WRONLY | O_CREAT: 打开文件的模式 (只写) 和标志 (如果文件不存在就创建)。0644: 文件权限 (如果创建文件,设置权限为 644)。open()返回的文件描述符 (一个数字) 就存放在fd变量中。write(fd, message, 14);:
write()是系统调用,请求操作系统向文件写入数据。fd: 文件描述符,告诉操作系统要写入哪个文件 (就是上面open()返回的数字)。message: 要写入的内容。14: 要写入内容的长度。close(fd);:
close()是系统调用,请求操作系统关闭文件。fd: 文件描述符,告诉操作系统要关闭哪个文件。在这个例子中,
fd就是文件描述符,它像一个“通行证号码”一样,让write()和close()系统调用知道你要操作的是哪个文件 “my_file.txt”。
完全错误的理解,文件描述符中的描述不是动词、是名词!
我们对于一个文件有三种标准操作、打开文件、关闭文件,错误(意外的错误)
这三个操作有自己的代号,比如打开就是1,关闭就是2,错误就是0
现在我们用文件描述符替换自然语言中的动词来描述我们对于文件的操作
1 file → 打开文件
2 file → 关闭文件
file 0 → 对文件的某种行为出现了意料之外的错误
注意,上面的过程中,我们没有说这个操作文件的动作的主语是谁,也就是 谁 1 file,谁用文件描述符操作了文件,这里的谁就是进程,进程是文件描述的拥有者,每个进程用自己的符号定义了对文件的三种标准操作每个进程都维护了自己的文件描述符