一、利用系统调用进行读写文件操作
open 是最核心的文件打开/创建系统调用,用于获取文件描述符(fd),后续的 write、read、close 等系统调用都依赖这个文件描述符。它直接与内核交互,支持灵活的文件操作模式和权限控制,是底层文件编程的基础。
函数原型:
#include <fcntl.h> // 包含 O_RDONLY、O_CREAT 等标志
#include <unistd.h> // 包含文件描述符相关定义
// 原型 1:打开已存在的文件(或创建文件,需配合 O_CREAT)
int open(const char *pathname, int flags);
// 原型 2:打开并指定文件权限(仅当 flags 包含 O_CREAT 时才需要第三个参数)
int open(const char *pathname, int flags, mode_t mode);
参数:
- pathname: 文件路径(绝对/相对)。绝对路径如 /home/user/test.c;相对路径如 test.c(相对于当前终端的工作目录)。进程知道自己在哪,即便文件不带路径,OS 也能知道要创建的文件放在哪里。
- flags (标记位):打开文件时传入的选项常量,可用'或'运算组合。常用常量包括:
- O_RDONLY: 只读打开
- O_WRONLY: 只写打开
- O_RDWR: 读,写打开
- O_CREAT: 若文件不存在,则创建它。需要使用 mode 选项指明新文件的访问权限。
- O_APPEND: 追加写,不清楚文件的内容。
- O_TRUNC: 清除文件的内容。
- mode: 文件权限(仅 flags 含 O_CREAT 时有效)。类型 mode_t,需用八进制数指定(如 0644、0755)。最终权限 = mode & ~umask。
- 返回值:成功返回新打开的文件描述符(fd);失败返回 -1。
在 C 语言层面,fopen 打开文件的方式有 r、r+、w、w+、a、a+,它们底层都会去调用 open 系统调用。上面使用的 fopen、fclose、fwrite 都是 C 标准库中的函数,称为库函数(libc)。这些函数是对系统调用的封装,方便二次开发,增加程序的可移植性。
write 文件写入系统调用
write 是 Linux 系统中最基础的文件写入系统调用,用于向文件描述符(文件、管道、socket 等)写入数据。它是底层 I/O 操作的核心,C 标准库的 fwrite 本质上也是对 write 的封装。
- 函数原型:
#include <unistd.h>
ssize_t write( fd, *buf, count);


