YOLOv13改进:RAB模块提升目标检测性能
2026/7/4 22:33:12
Linux 基础 IO(输入 / 输出)是操作系统与外部设备、文件进行数据交互的核心机制,其底层围绕文件描述符展开,遵循 “一切皆文件” 的设计理念。以下是基础 IO 的核心概念与操作梳理:
一切皆文件Linux 中,普通文件、目录、硬件设备(如键盘、显示器)、管道等都被抽象为文件,统一使用文件 IO 接口操作,简化了程序与不同设备的交互逻辑。
文件描述符(File Descriptor, FD)
0:标准输入(stdin),对应键盘等输入设备1:标准输出(stdout),对应显示器等输出设备2:标准错误(stderr),对应显示器等错误输出设备文件指针与 inode
Linux 基础 IO 主要依赖系统调用函数,区别于 C 语言标准库的 IO 函数(如fopen/fread),系统调用直接与内核交互,更贴近底层。
打开文件:open()函数原型:
c
运行
#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);pathname:文件路径(绝对 / 相对)flags:打开方式,常用取值:O_RDONLY:只读O_WRONLY:只写O_RDWR:读写O_CREAT:文件不存在则创建,需搭配mode指定权限O_TRUNC:文件存在则清空内容mode:创建文件时的权限(如0644),需与umask结合计算最终权限-1并设置errno。关闭文件:close()函数原型:
c
运行
#include <unistd.h> int close(int fd);fd:要关闭的文件描述符0,失败返回-1。读文件:read()函数原型:
c
运行
#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);fd:文件描述符buf:存储读取数据的缓冲区count:期望读取的字节数0;失败返回-1。写文件:write()函数原型:
c
运行
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);read()类似,buf为要写入的数据缓冲区-1。lseek()用于修改当前读写位置(文件指针),函数原型:
c
运行
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);offset:偏移量(可正可负)whence:偏移基准:SEEK_SET:从文件开头开始偏移SEEK_CUR:从当前位置开始偏移SEEK_END:从文件末尾开始偏移-1。lseek(fd, 0, SEEK_SET);C 语言标准库的 IO 函数(fopen/fread/fwrite)是对系统调用的封装,核心区别:
| 特性 | 系统调用 IO(open/read) | 标准库 IO(fopen/fread) |
|---|---|---|
| 操作对象 | 文件描述符(int) | 文件指针(FILE*) |
| 缓冲区 | 无(直接读写内核缓冲区) | 有用户态缓冲区(减少系统调用次数) |
| 适用场景 | 底层开发、精准控制 | 普通应用开发、效率优先 |
errno,可通过perror()或strerror()打印错误信息:c
运行
#include <stdio.h> #include <errno.h> #include <string.h> // 方式1:perror 直接打印错误描述 if (open("test.txt", O_RDONLY) == -1) { perror("open error"); } // 方式2:strerror 获取错误描述字符串 if (open("test.txt", O_RDONLY) == -1) { printf("open error: %s\n", strerror(errno)); }