Linux IO编程核心要点解析:文件、流与缓冲区实战指南
文章目录
- 1. Linux 文件类型
- 2. IO 概念
- 3. 系统调用 vs 库函数
- 4. 流(Stream)的概念
- 5. Windows 与 Linux 换行符
- 6. 缓冲区类型
- 7. 三种标准 IO 流
- 8. 缓冲区行为演示(buffer.c)
- 9. 关键函数总结
1. Linux 文件类型
类型 | 描述 | 示例 |
---|---|---|
常规文件 | 普通数据文件- | .txt , .c , 二进制文件 |
目录文件 | 存储文件路径信息d | /home , /etc |
字符设备 | 按字符流访问的设备c | 终端 /dev/tty ,键盘 /dev/input |
块设备 | 按数据块访问的设备b | 硬盘 /dev/sda ,U盘 /dev/sdb1 |
链接文件 | 文件快捷方式l | ln -s source.txt link_to_source |
2. IO 概念
- 输入设备:键盘(
/dev/input
)、鼠标。 - 输出设备:显示器(
/dev/fb0
)、打印机。 - 双向设备:U盘(
/dev/sdb1
)、网卡(eth0
)。
3. 系统调用 vs 库函数
类型 | 描述 | 示例函数 |
---|---|---|
系统调用 | 操作系统直接提供的接口 | open() , read() , write() |
库函数 | 封装系统调用的高级接口 | fopen() , fread() , printf() |
代码示例:
// 系统调用直接操作文件描述符
int fd = open("file.txt", O_RDWR);
write(fd, "Hello", 5);
// 库函数封装为文件流操作
FILE *fp = fopen("file.txt", "w");
fprintf(fp, "Hello");
4. 流(Stream)的概念
-
在 C 语言中,流是文件或设备的抽象,表示为
FILE
结构体。 -
示例:
FILE *fp = fopen("data.txt", "r"); // 打开文件流 char buffer[100]; fgets(buffer, 100, fp); // 从流中读取数据
5. Windows 与 Linux 换行符
- Windows:
\r\n
(回车 + 换行)。 - Linux:
\n
(仅换行)。
代码适配:
// 跨平台换行符处理
fprintf(fp, "Line1%c", '\n'); // Linux 正常,Windows 可能显示异常
fprintf(fp, "Line2\r\n"); // Windows 兼容
6. 缓冲区类型
类型 | 描述 | 触发条件 | 示例场景 |
---|---|---|---|
全缓冲 | 缓冲区满后刷新 | 默认文件操作 | 普通文件读写 |
行缓冲 | 遇到换行符或缓冲区满刷新 | 终端(标准输入/输出) | printf("Hello\n") |
无缓冲 | 直接写入设备 | 标准错误流(即时显示错误) | fprintf(stderr, ...) |
代码示例:
#include <stdio.h>
int main() {
printf("Hello"); // 行缓冲,无换行符时可能不立即显示
fflush(stdout); // 手动刷新缓冲区
return 0;
}
-
默认缓冲区大小:
- 全缓冲(文件操作):通常为
BUFSIZ
(定义在<stdio.h>
中),在大多数系统中为 8192 字节(8KB)。 - 行缓冲(终端输入/输出):通常为 1024 字节(但可能更小,如 512 字节)。
- 无缓冲(如
stderr
):数据直接写入设备,无缓冲区。
- 全缓冲(文件操作):通常为
-
查看默认值:
#include <stdio.h> printf("BUFSIZ = %d\n", BUFSIZ); // 输出默认缓冲区大小
7. 三种标准 IO 流
流类型 | 文件描述符 | 宏定义 | 默认设备 |
---|---|---|---|
标准输入流 | 0 | STDIN_FILENO | 键盘 |
标准输出流 | 1 | STDOUT_FILENO | 显示器 |
标准错误流 | 2 | STDERR_FILENO | 显示器 |
使用示例:
// 从键盘读取输入
char input[100];
fgets(input, 100, stdin);
// 向屏幕输出错误
fprintf(stderr, "Error: File not found!\n");
8. 缓冲区行为演示(buffer.c)
#include <stdio.h>
#include <unistd.h>
int main() {
printf("Hello"); // 行缓冲,无换行符时程序结束前不显示
sleep(2); // 休眠 2 秒
// 若此处调用 _exit(0)(不刷新缓冲区),则 "Hello" 不会显示
return 0; // 正常退出会刷新缓冲区
}
9. 关键函数总结
操作 | 系统调用 | 库函数 |
---|---|---|
打开文件 | open() | fopen() |
读取数据 | read() | fread() , fgets() |
写入数据 | write() | fwrite() , fprintf() |
关闭文件 | close() | fclose() |
设置缓冲区类型 | setvbuf() | - |
总结:Linux IO 编程需掌握文件类型、系统调用与库函数的区别、缓冲区机制及标准流的操作。通过合理使用缓冲策略和错误流,可以提升程序效率和健壮性。