2026/1/16 11:33:09
网站建设
项目流程
北京做网站的好公司有哪些,设计素材网站导航大全,重庆城乡建设信息网,兰溪优秀高端网站设计地址一、文件 IO 核心概念#xff1a;系统调用 vs 标准 IO
在 Linux 中操作文件有两种核心方式#xff1a;文件 IO#xff08;系统调用#xff09; 和标准 IO#xff08;C 库函数#xff09;#xff0c;二者底层关联但适用场景不同。
1.1 核心定义
类型本质核心特征适用场…一、文件 IO 核心概念系统调用 vs 标准 IO在 Linux 中操作文件有两种核心方式文件 IO系统调用和标准 IOC 库函数二者底层关联但适用场景不同。1.1 核心定义类型本质核心特征适用场景文件 IO操作系统对外提供的系统调用函数无缓冲区、文件描述符int、功能强大设备文件如/dev下设备、实时性要求高的场景标准 IOC 标准库封装的文件操作函数带缓冲区、文件流指针FILE*、跨平台普通文件文本 / 二进制、通用文件操作1.2 核心关系底层依赖标准 IOC 库是对文件 IO系统调用的封装跨平台特性由 C 库保证而系统调用是 Linux 内核直接提供的功能缓存差异标准 IO 的缓冲区减少了系统调用次数提升普通文件操作效率文件 IO 无缓存直接操作内核资源适合设备文件操作对象文件 IO 用 “文件描述符fd” 标识文件标准 IO 用 “文件流指针FILE*” 标识。1.3 共同点与区别维度共同点区别核心目标均用于文件读写操作文件 IO无缓存、fd、系统调用标准 IO有缓存、FILE*、C 库封装跨平台性-文件 IO依赖具体系统如 Linux标准 IO跨平台Windows/Linux 通用效率-普通文件标准 IO 更高缓存设备文件文件 IO 更优实时二、文件 IO 核心函数open/read/write/close文件 IO 的操作流程遵循 “打开→读写→关闭” 的固定范式核心依赖open/read/write/close四个系统调用。2.1 打开文件open函数原型c运行#include sys/types.h #include sys/stat.h #include fcntl.h int open(const char *pathname, int flags, mode_t mode);核心参数参数说明常用取值pathname文件路径绝对 / 相对路径1.txt、/etc/passwdflags打开模式必选 可选组合必选O_RDONLY只读、O_WRONLY只写、O_RDWR读写可选O_CREAT创建文件、O_TRUNC清空文件、O_APPEND追加写mode文件权限仅O_CREAT时有效0666读写权限、0777读写执行权限返回值成功返回非负整数文件描述符fd唯一标识打开的文件失败返回 - 1可通过perror查看错误原因。示例c运行// 以只写创建清空模式打开1.txt权限0666 int fd open(1.txt, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd -1) { perror(open failed); return 1; }2.2 读取文件read函数原型c运行#include unistd.h ssize_t read(int fd, void *buf, size_t count);核心参数参数说明fd目标文件的文件描述符open 返回值buf接收数据的内存缓冲区需提前分配空间count本次读取的最大字节数建议大于文件实际大小返回值0实际读取到的字节数0文件读取到末尾0读取失败如 fd 无效、文件不存在。示例c运行char buf[1024] {0}; // 从fd读取最多1024字节到buf ssize_t n read(fd, buf, sizeof(buf)); if (n 0) { perror(read failed); close(fd); return 1; } printf(读取到%d字节%s\n, n, buf);2.3 写入文件write函数原型c运行#include unistd.h ssize_t write(int fd, const void *buf, size_t count);核心参数参数说明fd目标文件的文件描述符buf待写入文件的数据缓冲区count待写入数据的有效长度如strlen(buf)返回值0实际写入的字节数0未写入任何字节普通文件不会出现设备文件可能0写入失败。示例c运行char *data Hello Linux File IO!; // 写入data到fd长度为字符串有效长度 ssize_t n write(fd, data, strlen(data)); if (n 0) { perror(write failed); close(fd); return 1; } printf(写入%d字节\n, n);2.4 关闭文件close函数原型c运行#include unistd.h int close(int fd);核心说明功能释放文件描述符对应的内核资源必须调用否则会导致资源泄漏返回值成功返回 0失败返回 - 1。示例c运行if (close(fd) -1) { perror(close failed); return 1; }三、目录操作opendir/readdir/closedir除了普通文件Linux 中目录也是一种特殊文件需通过专门的函数操作流程为 “打开目录→读取目录→关闭目录”。3.1 打开目录opendir函数原型c运行#include dirent.h DIR *opendir(const char *name);功能打开指定目录返回目录流指针参数name为目录路径如.、/home返回值成功返回DIR*目录流指针失败返回 NULL。3.2 读取目录readdir函数原型c运行#include dirent.h struct dirent *readdir(DIR *dirp);功能从目录流中读取一个文件 / 子目录的信息参数dirp为opendir返回的目录流指针返回值成功返回struct dirent*包含文件名、文件类型等信息失败 / 目录末尾返回 NULL。核心结构体struct direntc运行struct dirent { ino_t d_ino; // 索引节点号 char d_name[256]; // 文件名核心字段 // 其他字段文件类型、偏移量等 };3.3 关闭目录closedir函数原型c运行#include dirent.h int closedir(DIR *dirp);功能关闭目录流释放资源返回值成功返回 0失败返回 - 1。3.4 目录操作示例c运行#include stdio.h #include dirent.h int main() { // 打开当前目录 DIR *dir opendir(.); if (dir NULL) { perror(opendir failed); return 1; } // 遍历目录中的文件 struct dirent *entry; while ((entry readdir(dir)) ! NULL) { printf(文件名%s\n, entry-d_name); } // 关闭目录 closedir(dir); return 0; }四、MakefileLinux 工程编译的 “一键工具”当工程包含多个源文件时手动执行gcc编译效率极低Makefile 可实现 “一键编译”自动管理编译依赖和规则。4.1 Makefile 核心概念命令执行make命令时系统会查找当前目录的makefile/Makefile文件并执行核心规则目标依赖\n\t规则TAB 缩进是关键不能用空格目标要生成的文件如a.out或操作如clean依赖生成目标所需的文件如main.c、func.c规则生成目标的编译命令如gcc main.c func.c -o a.out。4.2 Makefile 编写进阶从基础到通用版本 1基础规则固定依赖makefile# 目标a.out依赖main.c、func.c a.out:main.c func.c gcc main.c func.c -o a.out # 无依赖的目标清理编译产物 clean: rm -f a.out执行make编译生成a.out仅当依赖文件修改时重新编译执行make clean删除a.out缺点依赖文件 / 编译命令固定修改时需全量改动。版本 2内置变量简化规则Makefile 提供内置变量简化编写核心内置变量$^当前规则的所有依赖文件$当前规则的目标文件。makefilea.out:main.c func.c gcc $^ -o $ # 等价于 gcc main.c func.c -o a.out clean: rm -f $ # 等价于 rm -f a.out版本 3自定义变量通用模板通过自定义变量适配不同工程可灵活修改源文件、目标名、编译选项makefile# 自定义变量源文件、目标名、编译选项 SRC main.c SRC func.c # 追加源文件 APP a.out FLAG -g # 编译调试信息 # 规则依赖为SRC目标为APP $(APP):$(SRC) gcc $^ -o $ $(FLAG) # 加入编译选项 # 清理规则 clean: rm -f $(APP)4.3 Makefile 核心特性增量编译仅当依赖文件如main.c修改时才重新编译生成目标a.out未修改则提示is up to date多目标支持可定义多个目标如all、clean、install执行make 目标名即可触发对应规则工程管理支持跨目录源文件编译、自定义编译脚本是大型 Linux 工程的标配。五、核心实战文件 IO Makefile 完整示例5.1 源文件main.cc运行#include stdio.h #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include string.h int main() { // 1. 打开文件 int fd open(test.txt, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd -1) { perror(open failed); return 1; } // 2. 写入文件 char *data Hello File IO!\n; write(fd, data, strlen(data)); // 3. 关闭文件 close(fd); // 重新打开读取 fd open(test.txt, O_RDONLY); if (fd -1) { perror(open failed); return 1; } char buf[1024] {0}; read(fd, buf, sizeof(buf)); printf(读取内容%s, buf); close(fd); return 0; }5.2 MakefilemakefileSRC main.c APP file_io_demo FLAG -g $(APP):$(SRC) gcc $^ -o $ $(FLAG) clean: rm -f $(APP) test.txt5.3 编译 运行bash运行# 编译 make # 运行 ./file_io_demo # 清理 make clean六、核心总结文件 IO基于系统调用无缓存、用文件描述符适合设备文件 / 实时场景标准 IO 基于 C 库封装有缓存、跨平台适合普通文件文件操作流程打开open→ 读写read/write→ 关闭close目录操作需用 opendir/readdir/closedirMakefile核心规则为 “目标依赖 规则”通过内置 / 自定义变量实现通用编译模板支持增量编译是 Linux 工程编译的核心工具实战中需结合场景选择文件操作方式通过 Makefile 简化编译流程提升开发效率。