Linux I/O 文件操作详解:从系统调用到实际工程应用

一、写在前面

在 Linux 或任何类 Unix 操作系统中,文件是一切的核心 —— 无论是硬盘上的文本文件,还是串口设备、GPIO寄存器、甚至网络接口,几乎都被抽象为“文件”。理解 Linux 下的 I/O 文件操作机制,不仅是嵌入式开发的基础,也是进行系统编程与底层控制的关键。


二、I/O 的本质:一切皆文件

Linux 将外设抽象成文件的方式,统一了对各种资源的操作模型。你可以用 open 打开串口设备 /dev/ttyS0,也可以用 read/write 操作传感器 /sys/class/hwmon/,它们底层走的是同一套文件 I/O 接口。

文件类型示意:

类型

路径示例

描述

普通文件

/home/user/log.txt

文本或二进制文件

设备文件

/dev/ttyUSB0

串口、I2C、SPI 等设备

虚拟文件

/proc/cpuinfo

内核状态接口

管道/套接字

/tmp/mysocket

IPC、网络通信

三、系统调用层:open、read、write、close

这是 C/C++ 程序员在 Linux 中进行文件操作最基本的方式,适用于嵌入式系统、驱动开发等需要精细控制资源的场景。

1. open() - 打开文件

#include int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

  • O_RDONLY / O_WRONLY / O_RDWR:读、写、读写权限

  • O_CREAT:若文件不存在则创建(需搭配 mode_t 权限位)

  • 返回值:文件描述符(int 类型,≥0)或 -1(出错)

2. read() - 读取数据

ssize_t len = read(fd, buf, sizeo(buf));


 

  • 阻塞直到读取到数据或出错

  • 返回读取的字节数

3. write() - 写入数据

write(fd, "hello", 5);

4. close() - 关闭文件

close(fd);


四、标准 I/O 层(C库层):fopen、fread、fwrite、fclose

stdio.h 提供的标准 I/O 函数基于文件流,适合操作文本文件或非高实时性的文件操作,底层仍通过系统调用实现。

示例:

FILE *fp = fopen("log.txt", "w");fprintf(fp, "Hello world\n");fclose(fp);

标准 I/O 提供了缓冲机制,默认对终端是行缓冲、对文件是全缓冲,这使得它更适合批量文件操作。


五、文件描述符与 FILE* 的区别

层级

类型

示例

是否缓冲

系统调用层

int

open()

C标准库层

FILE*

fopen()

标准库封装了系统调用,并加上了缓冲处理。在高性能嵌入式应用中,建议使用系统调用方式获得最大控制力。


六、文件权限与访问控制

Linux 每个文件都具备权限控制位(rwx),其权限由 chmod 设置,程序中也可以指定:

int fd = open("data.txt", O_CREAT | O_WRONLY, 0644);

  • 0644:所有者读写,其他人只读

  • 0777:全权限


七、常用文件操作函数一览(快速参考)

操作

系统调用

标准库函数

打开文件

open() fopen()

读取文件

read() fread()

 / fgets()

写入文件

write() fwrite()

 / fprintf()

移动指针

lseek() fseek()

关闭文件

close() fclose()

删除文件

unlink() remove()

你可能感兴趣的:(linux学习,linux,运维,服务器)