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;
}
1,ls
ls -a 查看所有文件
ls -l 查看详细的属性
2,lsattr
查看文件的扩展属性,
如果文件被 chattr +i 添加了写保护,
用lsattr可以看到添加的属性
3,file
查看文件的类型
4,stat
查看文件的状态