1. 前置知识点回顾
在之前的文章中,我们提到了以下知识点:
- Linux 一切皆是文件。
- C 语言提供的 printf,fprintf,fgets,fread,fwrite,这几种接口。
- C 语言提供的几种打开文件的模式:只读,只写,追加等等。
我们将持续深入文件操作结合 Linux 系统来完成本篇文章,当你读完本篇文章,你会知道以下几点:
- open 函数的参数解析(位图);
- 什么是 fd(文件描述符);
- 如何使用 write/read/close;
- fd 的分配规则(重定向的基础)。
2. Linux 最底层的文件打开方式:open()
open 函数是 Linux 系统中用于打开或创建文件的系统调用接口(System Call),它比 C 标准库的 fopen 更底层。 所需头文件如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型如下: 对于已经创建好的文件:
int open(const char *pathname, int flags);
创建新文件(需要指定权限):
int open(const char *pathname, int flags, mode_t mode);
2-1 参数 const char *pathname 解释:
这里的路径名称很简单:我们给出指定的文件名,如果前面不加路径,就是默认在进程所处文件下进行创建:
目标文件的路径(绝对路径或相对路径),例如 'data.txt' 或 '/home/user/log.txt'。
2-2 参数 int flags 标志位的解释:
决定文件的打开方式。必须包含以下访问模式之一(且只能选一个):
- O_RDONLY:以只读方式打开。
- O_WRONLY:以只写方式打开。
- O_RDWR:以读写方式打开。(这个我们也用的少)
你可以通过按位或 (|) 运算符组合以下可选标志:
- O_CREAT:如果文件不存在,则创建它。注意:使用此标志时必须提供第三个参数 mode。
- O_APPEND:每次写操作都追加到文件末尾。
- O_TRUNC:如果文件存在且以写方式打开,将其长度截断为 0(清空内容)。
- O_EXCL:与 O_CREAT 连用,如果文件已存在,则返回错误(用于确保原子创建)。


