前言
在 Linux 系统中,程序与文件的交互离不开'系统文件 I/O'——这是操作系统为用户层程序提供的一套底层接口。无论是日常使用的文本编辑器,还是后台运行的服务程序,其读写文件、处理输入输出的能力,最终都依赖于 open、write、read、dup2 等系统调用。
对于开发者来说,系统文件 I/O 的知识点往往零散:标志位的组合规律?open 返回的文件描述符含义?为什么 fd=0,1,2 被默认占用?重定向如何通过 dup2 实现?本文将以'文件描述符'为线索,从标志位传递、open 函数入手,拆解读写操作逻辑,讲解文件描述符分配规则,最后聚焦重定向原理。
打开文件的方式不仅仅是 fopen、ifstream 等语言层方案,系统调用才是底层方案。在学习系统文件 I/O 之前,先了解如何给函数传递标志位。
传递标志位
通过位运算组合标志的方式,能高效地用一个整数表示多种状态,广泛用于选项控制、权限管理等场景。
#include <stdio.h>
#define ONE_FLAG (1<<0)
#define TWO_FLAG (1<<1)
#define THREE_FLAG (1<<2)
#define FOUR_FLAG (1<<3)
void print(int flags){
if(flags & ONE_FLAG){ printf("One!\n"); }
if(flags & TWO_FLAG){ printf("Two!\n"); }
if(flags & THREE_FLAG){ printf("Three!\n"); }
if(flags & FOUR_FLAG){ printf("Four!\n"); }
printf("\n");
}
int main() {
print(ONE_FLAG);
print(ONE_FLAG | TWO_FLAG);
print(ONE_FLAG | TWO_FLAG | THREE_FLAG);
print(ONE_FLAG | TWO_FLAG | THREE_FLAG | FOUR_FLAG);
print(TWO_FLAG | FOUR_FLAG);
return 0;
}


