Linux-文件系统,文件操作

一.存储设备文件系统
提到文件系统时, Windows 下的 FAT32、NTFS、exFAT 以及 Linux 下常用的 ext2、ext3 和 ext4 的类型格式。这些文件系统都是为了解决如何高效管理存储器EEPROM、Nor FLASH、NAND FLASH、eMMC 到机械硬盘空间的问题而诞生的。

在 Linux 系统中,一切皆文件,它把一切资源都看作是文件,包括硬件设备,通常称为设备文件。

在 Linux 下,ext2 适用于 U 盘(但为了兼容,使用得比较多的还是 FAT32 或 exFAT),日常应用推荐使用 ext4。

Linux 内核本身也支持 FAT32 文件系统。所以使用开发板出厂的默认 Linux 系统时,把 FAT32 格式的 U 盘直接插入到开发板是可以自动挂载的。
主机上的 Ubuntu 对于 NTFS 或 FAT32 的 U 盘都能自动识别并挂载,因为 U buntu 发行版安装了相应的支持。

查看系统当前存储设备使用的文件系统:

df -T

二.伪文件系统
Linux 内核还提供了 procfs、sysfs 和devfs 等伪文件系统。/proc、/sys、/dev
伪文件系统存在于内存中,通常不占用硬盘空间,它以文件的形式,向用户提供了访问系统内核数据的接口。用户和应用程序可以通过访问这些数据接口,得到系统的信息,而且内核允许用户修改内核的某些参数。
在/proc 目录查看一些系统信息

# 查看 CPU 信息
cat /proc/cpuinfo
# 查看 proc 目录
ls /proc

三.虚拟文件系统
除了存储器文件系统 FAT32、ext4,伪文件系统/proc、/sys、/dev 外,还有内存文件系统ramfs,网络文件系统 nfs 等等,不同的文件系统标准,需要使用不同的程序逻辑实现访问,对外提供的访问接口可能也稍有差异。虚拟文件系统整合上述文件系统,提供统一的调用接口函数,大都可以通过类似 fopen、fread、fwrite 等 C 标准库函数访问文件,这都是虚拟文件系统的功劳。

虚拟文件系统屏蔽了各种硬件上的差异以及具体实现的细节,为所有的硬件设备提供统一的接口,从而达到设备无关性的目的,同时文件管理系统还为应用层提供统一的 API 接口。

捕获.JPG

上图解构如下:
• 应用层指用户编写的程序,如我们的 hello.c。
• GNU C 库(glibc)即 C 语言标准库,例如在编译器章节介绍的 libc.so.6 文件,它包含了printf、malloc,以及本章使用的 fopen、fread、fwrite 等文件操作函数。
• 用户程序和 glibc 库都是属于用户空间的,本质都是用户程序。
• 应用层的程序和 glibc 可能会调用到“系统调用层(SCI)”的函数,这些函数是 Linux 内核对外提供的函数接口,用户通过这些函数向系统申请操作。例如,C 库的 printf 函数使用了系统的 vsprintf 和 write 函数,C 库的 fopen、fread、fwrite 分别调用了系统的 open、read、write 函数,具体可以阅读 glibc 的源码了解。
• 由于文件系统种类非常多,跟文件操作相关的 open、read、write 等函数经过虚拟文件系统
层,再访问具体的文件系统。

#include <stdio.h>
#include <string.h>
//要写入的字符串
const char buf[] = "filesystem_test:Hello World!\n"; 6 //文件描述符
FILE *fp;
char str[100];


int main(void)
 {
 //创建一个文件
 fp = fopen("filesystem_test.txt", "w+");
 //正常返回文件指针
 //异常返回 NULL
 if(NULL == fp){
 printf("Fail to Open File\n");
 return 0;
 }
//将 buf 的内容写入文件
 //每次写入 1 个字节,总长度由 strlen 给出
fwrite(buf, 1, strlen(buf), fp);

//写入 Embedfire
//每次写入 1 个字节,总长度由 strlen 给出
 fwrite("Embedfire\n", 1, strlen("Embedfire\n"),fp);
//把缓冲区的数据立即写入文件
 fflush(fp);

 //此时的文件位置指针位于文件的结尾处,使用 fseek 函数使文件指针回到文件头
 fseek(fp, 0, SEEK_SET);

 //从文件中读取内容到 str 中
 //每次读取 100 个字节,读取 1 次
 fread(str, 100, 1, fp);

 printf("File content:\n%s \n", str);

 fclose(fp);

return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值