当然可以!以下是**《Linux 基础 I/O(输入输出)》教程**,为你系统讲解 Linux 系统中最基本、最核心的 I/O 编程概念,适用于初学者或希望深入理解 UNIX/Linux I/O 模型的开发者。


📘 教程标题:

《Linux 基础 I/O:文件、标准流与系统调用初识》


🧭 教程目录

  1. I/O 是什么?I/O 的三种分类
  2. Linux 中文件即一切(Everything is a File)
  3. 标准输入输出与错误(stdin、stdout、stderr)
  4. 文件描述符(File Descriptor)
  5. 基本系统调用:openreadwriteclose
  6. 文件打开模式与权限标志
  7. 重定向与管道简述
  8. 高级话题预览:缓冲 I/O vs 非缓冲 I/O
  9. 示例代码 + 编译运行
  10. 常见错误与调试技巧

1️⃣ I/O 是什么?三种典型分类

在 Linux/Unix 中,I/O 指“输入输出”操作,本质上就是程序与外界交换数据。主要分为:

类型举例
标准 I/Oprintf()scanf()fopen()
低级系统调用 I/Oread()write()open()
网络 I/Orecv()send()、Socket 编程

本教程聚焦于第二种:系统调用级别的文件 I/O 操作


2️⃣ Linux 中文件即一切

Linux 把一切都抽象为文件,包括:

  • 普通文件 /etc/passwd
  • 设备 /dev/sda /dev/null
  • 网络连接 /proc/net/tcp
  • 管道、套接字、FIFO…

3️⃣ 三个标准流:stdin / stdout / stderr

名称文件描述符用途
标准输入 stdin0通常是键盘输入
标准输出 stdout1通常是屏幕显示
标准错误 stderr2错误信息输出,不受重定向干扰

4️⃣ 文件描述符(FD)

文件描述符是 Linux 内核为打开的每个文件分配的整数句柄:

int fd = open("file.txt", O_RDONLY);

你可以把它理解为“文件的句柄”,在调用 readwrite 等操作时使用。


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/Ofopen() vs open()
非阻塞 I/O设置 O_NONBLOCK
IO 多路复用select() / poll() / epoll()
内存映射 I/Ommap()

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 openman 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 工具

请告诉我,我可以继续为你整理相关资源。是否继续?