当然可以!以下是**《Linux 基础 I/O(输入输出)》教程**,为你系统讲解 Linux 系统中最基本、最核心的 I/O 编程概念,适用于初学者或希望深入理解 UNIX/Linux I/O 模型的开发者。
📘 教程标题:
《Linux 基础 I/O:文件、标准流与系统调用初识》
🧭 教程目录
- I/O 是什么?I/O 的三种分类
- Linux 中文件即一切(Everything is a File)
- 标准输入输出与错误(stdin、stdout、stderr)
- 文件描述符(File Descriptor)
- 基本系统调用:
open
、read
、write
、close
- 文件打开模式与权限标志
- 重定向与管道简述
- 高级话题预览:缓冲 I/O vs 非缓冲 I/O
- 示例代码 + 编译运行
- 常见错误与调试技巧
1️⃣ I/O 是什么?三种典型分类
在 Linux/Unix 中,I/O 指“输入输出”操作,本质上就是程序与外界交换数据。主要分为:
类型 | 举例 |
---|---|
标准 I/O | printf() 、scanf() 、fopen() |
低级系统调用 I/O | read() 、write() 、open() |
网络 I/O | recv() 、send() 、Socket 编程 |
本教程聚焦于第二种:系统调用级别的文件 I/O 操作。
2️⃣ Linux 中文件即一切
Linux 把一切都抽象为文件,包括:
- 普通文件
/etc/passwd
- 设备
/dev/sda
/dev/null
- 网络连接
/proc/net/tcp
- 管道、套接字、FIFO…
3️⃣ 三个标准流:stdin / stdout / stderr
名称 | 文件描述符 | 用途 |
---|---|---|
标准输入 stdin | 0 | 通常是键盘输入 |
标准输出 stdout | 1 | 通常是屏幕显示 |
标准错误 stderr | 2 | 错误信息输出,不受重定向干扰 |
4️⃣ 文件描述符(FD)
文件描述符是 Linux 内核为打开的每个文件分配的整数句柄:
int fd = open("file.txt", O_RDONLY);
你可以把它理解为“文件的句柄”,在调用 read
、write
等操作时使用。
5️⃣ 基本系统调用:open/read/write/close
open()
int open(const char *pathname, int flags, mode_t mode);
示例:
int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);
read()
& write()
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
示例:
char buf[100];
int n = read(fd, buf, 100);
write(STDOUT_FILENO, buf, n); // 输出到屏幕
close()
close(fd);
6️⃣ 打开模式和权限标志(常见组合)
常量 | 含义 |
---|---|
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 可读写 |
O_CREAT | 文件不存在时创建 |
O_APPEND | 追加写入 |
O_TRUNC | 清空已有文件 |
7️⃣ 重定向与管道简述
- 重定向标准输出:
./myapp > out.txt
- 重定向错误输出:
./myapp 2> err.log
- 同时重定向输出和错误:
./myapp > all.log 2>&1
- 管道:
cat file.txt | grep "keyword"
8️⃣ 高级话题预览(后续可学)
话题 | 简述 |
---|---|
缓冲 I/O 与非缓冲 I/O | fopen() vs open() |
非阻塞 I/O | 设置 O_NONBLOCK |
IO 多路复用 | select() / poll() / epoll() |
内存映射 I/O | mmap() |
9️⃣ 示例代码(基础文件复制)
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int in = open("input.txt", O_RDONLY);
if (in < 0) {
perror("open input");
exit(1);
}
int out = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (out < 0) {
perror("open output");
close(in);
exit(1);
}
char buffer[1024];
ssize_t n;
while ((n = read(in, buffer, sizeof(buffer))) > 0) {
write(out, buffer, n);
}
close(in);
close(out);
return 0;
}
编译运行:
gcc io_copy.c -o io_copy
./io_copy
🔟 常见错误排查技巧
问题 | 原因 | 解决方式 |
---|---|---|
Permission denied | 无写权限 | 使用 chmod 修改权限 |
No such file | 路径错误 | 确认文件路径是否正确 |
read 返回 0 | 已读到文件尾 | 说明读取完成 |
write 返回 -1 | 写失败 | 使用 perror() 查看错误信息 |
📚 学习建议与延伸阅读
资源 | 链接 |
---|---|
man 手册 | man 2 open , man 2 read |
《UNIX环境高级编程》 | W. Richard Stevens 著 |
教程:Linux系统调用详解 | https://man7.org/linux/man-pages/ |
中文博客推荐 | https://coolshell.cn/archives/11855.html |
✅ 小结
通过本教程你将掌握:
- Linux 文件与标准流的基本模型
- 使用系统调用进行读写的能力
- 文件描述符与系统资源管理的关系
- 编写基本的 Linux 命令行 I/O 程序
📦 如果你需要:
- 本教程打包为 PDF 或 Markdown 文件
- 示例代码打包压缩下载
- 进阶篇《Linux 高级 I/O(select/epoll/mmap)》
- 项目练习:写一个简易
cat
或wc
工具
请告诉我,我可以继续为你整理相关资源。是否继续?
发表回复