1. Linux基础IO概述
在Linux系统中,输入输出(IO)操作是系统与外部世界交互的核心通道。无论是读写文件、网络通信还是设备控制,本质上都是通过IO子系统完成的。Linux的IO设计遵循"一切皆文件"的哲学,这种抽象使得开发者可以用统一的文件操作接口处理各种不同类型的IO。
注意:Linux中的文件概念不仅包括磁盘文件,还包括设备文件、管道、套接字等特殊文件类型。
我刚开始接触Linux IO时,最困惑的就是为什么连硬件设备都能用open()/read()/write()来操作。后来发现这正是Unix设计的高明之处——通过统一的接口简化编程模型。比如操作串口设备,只需要像普通文件一样打开/dev/ttyS0就能进行读写。
2. Linux IO模型解析
2.1 文件描述符机制
每个进程启动时都会自动打开三个文件描述符:
- 0:标准输入(stdin)
- 1:标准输出(stdout)
- 2:标准错误(stderr)
通过open()系统调用创建新文件描述符时,内核会返回当前可用的最小整数。这个设计看似简单却非常实用:
c复制int fd = open("test.txt", O_RDWR);
if(fd == -1) {
perror("open failed");
exit(1);
}
实操心得:文件描述符是进程级别的资源,fork()创建的子进程会继承父进程的所有文件描述符,这在实现进程间通信时非常有用。
2.2 标准IO与文件IO
Linux提供两套IO接口:
- 标准IO库(stdio):带缓冲的高级接口
- 文件IO:直接的系统调用
实际开发中要根据场景选择:
- 需要频繁读写小数据量时用标准IO(减少系统调用)
- 需要精确控制IO行为时用文件IO
c复制// 标准IO示例
FILE *fp = fopen("log.txt","a");
fprintf(fp, "System start at %s\n", ctime(&now));
// 文件IO示例
int fd = open("data.bin", O_RDONLY);
read(fd, buffer, sizeof(buffer));
