1. 从命令行参数到文件操作:Linux IO编程基础
在Linux系统编程中,文件操作是最基础也是最重要的技能之一。作为一名长期从事嵌入式开发的工程师,我发现很多初学者在刚接触Linux文件IO时,往往会被各种概念和API搞得晕头转向。今天我就结合自己多年的实战经验,带大家彻底搞懂Linux下的文件操作机制。
1.1 程序入口:带参数的main函数
任何实用的文件操作程序都需要从命令行接收参数,这就是带参main函数的作用。它的标准形式如下:
c复制int main(int argc, char *argv[])
这里有两个关键参数需要理解:
argc(argument count):表示命令行参数的总个数,包括程序名本身argv(argument vector):是一个字符串数组,存储每个具体的参数
举个例子,如果我们执行:
bash复制./file_operation test.txt rw
那么:
argc的值为3argv[0]是"./file_operation"argv[1]是"test.txt"argv[2]是"rw"
实际开发中,我建议总是先检查argc的值,避免用户未提供足够参数导致程序崩溃。比如:
c复制if(argc < 3) { printf("Usage: %s <filename> <mode>\n", argv[0]); return -1; }
1.2 文件操作的两大流派
Linux下的文件操作主要分为两大流派:
- 文件IO(系统调用IO):直接调用Linux内核提供的系统调用
- 标准IO(C标准库IO):使用C语言标准库封装的高级接口
这两种方式各有优劣,我们会在后面详细对比。但首先,我们需要理解它们各自的核心概念和基本用法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文件IO:直接与内核对话
2.1 文件IO的核心概念
文件IO是Linux原生的系统调用级接口,它遵循Linux"一切皆文件"的哲学。这意味着不仅仅是普通文件,包括设备、管道、socket等都可以用文件IO的方式来操作。
文件IO有几个关键特性:
- 无缓冲区:每次读写都会触发用户态和内核态的切换
- 文件描述符:用非负整数(0~1023)标识打开的文件
- 预定义的描述符:
- 0:标准输入(stdin)
- 1:标准输出(stdout)
- 2:标准错误(stderr)
2.2 文件IO操作三部曲
标准的文件IO操作遵循以下流程:
- 打开文件:使用open系统调用
- 操作文件:read/write/lseek等
- 关闭文件:close系统调用
2.2.1 打开文件:open系统调用
c复制int open(cons
