嵌入式Linux:Linux系统中文件类型

news2024/10/6 22:34:21

目录

1、普通文件

2、目录文件

3、字符设备文件

4、块设备文件

5、符号链接文件

6、套接字文件

7、管道文件

8、stat命令和ls命令

8.1、stat命令

8.2、ls命令

9、stat、fstat、lstat函数

9.1、stat函数

9.2、fstat函数

9.3、lstat函数


在Windows系统中,操作系统通常通过文件名后缀来识别文件类型。例如,C语言头文件使用“.h”后缀,C语言源文件使用“.c”后缀,文本文件使用“.txt”后缀,压缩包文件使用“.zip”后缀。打开文件时,Windows会根据文件名后缀确定文件类型,然后调用相应的程序打开它。例如,打开“.c”文件时会使用C代码编辑器,打开“.zip”文件时会使用解压软件。

然而,在Linux系统中,文件类型并不是通过文件后缀名来识别的。这并不意味着文件名后缀可以随意添加。文件名和后缀主要是为了方便“人”查看和识别。尽管Linux系统不依赖后缀来识别文件,但规范地使用后缀仍然很重要。例如,C源文件应以“.c”结尾,C头文件应以“.h”结尾,Shell脚本文件应以“.sh”结尾。这是为了方便我们自己查看和管理文件。

在Linux系统中,共有七种文件类型:

  • 普通文件;
  • 目录文件;
  • 字符设备文件;
  • 块设备文件;
  • 符号链接文件;
  • 套接字文件;
  • 管道文件。

1、普通文件

普通文件(regular file)是Linux系统中最常见的文件类型,如文本文件、二进制文件以及我们编写的源代码文件等。普通文件中的数据存储在系统磁盘中,可以访问和读取这些文件中的内容,文件内容以字节为单位进行存储和访问。

普通文件可以分为两大类:文本文件和二进制文件。

文本文件:文本文件的内容由ASCII码字符构成。虽然文件本质上都是数字(因为计算机只识别0和1,磁盘上的文件内容也是由0和1构成),但文本文件中的数字应该被理解为对应的ASCII字符码。例如,常见的.c、.h、.sh、.txt文件都是文本文件。文本文件的优点是方便人类阅读、浏览和编写。

示例:

cat example.txt

二进制文件:二进制文件中存储的也是数字,但这些数字不是文本字符编码,而是真正的数值。例如,Linux系统下的可执行文件、C代码编译后的.o文件、.bin文件等都是二进制文件。

示例:

hexdump -C example.bin

2、目录文件

目录文件(directory file)是用于组织和管理其他文件和子目录的特殊文件。目录文件包含指向其他文件和目录的列表,使得文件系统具有层次结构。目录文件的主要作用是提供一种方式来组织文件系统中的数据,使得文件和目录可以以一种树状结构进行管理。

3、字符设备文件

字符设备文件(Character Device File)是一种特殊的文件类型,用于与字符设备进行直接的字符流通信。字符设备通常是那些可以一次一个字符地读写的设备,如键盘、鼠标、串口(serial port)和终端(terminal)。

4、块设备文件

块设备文件(block device file)是一种特殊的文件类型,用于与块设备进行交互。块设备是一种数据存储设备,允许以固定大小的块(通常为512字节或更大的倍数)进行数据读写操作。常见的块设备包括硬盘、光盘、USB存储设备等。

下图中agpgart、autofs、btrfs-control、console 等这些都是字符设备文件,而 loop0、loop1这些便是块设备文件。

5、符号链接文件

符号链接文件(symbolic link file,也称为软链接)是一种特殊的文件类型,用于指向另一个文件或目录。符号链接类似于Windows系统中的快捷方式。符号链接文件包含指向目标文件或目录的路径,而不是文件内容本身。它们允许用户方便地访问和管理文件和目录。

在上图中,cdrom、cdrw、fd、initctl等这些文件都是符号链接文件,箭头所指向的文件路径便是符号链接文件所指向的文件。

6、套接字文件

套接字文件是Linux系统中用于进程间通信的特殊文件类型,常用于本地进程间通信。它们允许同一台机器上的进程通过文件系统中的套接字文件进行通信。通过使用编程接口,可以方便地创建和管理套接字文件,实现高效的进程间通信。

7、管道文件

管道文件(pipe)是一种特殊的文件类型,用于在进程间进行通信。管道文件提供了一种单向数据流的机制,其中一个进程向管道写入数据,而另一个进程从管道读取数据。管道文件在命令行中广泛用于将一个命令的输出传递给另一个命令作为输入。

8、stat命令和ls命令

stat 命令和 ls 命令是Linux系统中常用的两个命令,用于查看文件和目录的详细信息。

8.1、stat命令

stat 命令用于显示文件或文件系统的详细状态信息。它提供的信息包括文件的大小、权限、所有者、修改时间、访问时间等。

查看单个文件的信息:

stat example.txt

输出示例:

File: example.txt
Size: 1234            Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d    Inode: 1234567     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  user)   Gid: ( 1000/  user)
Access: 2024-06-06 12:00:00.000000000 +0000
Modify: 2024-06-06 12:00:00.000000000 +0000
Change: 2024-06-06 12:00:00.000000000 +0000
Birth: -

查看目录的信息:

stat /home/user

输出示例:

File: /home/user
Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 803h/2051d    Inode: 567890      Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/  user)   Gid: ( 1000/  user)
Access: 2024-06-06 12:00:00.000000000 +0000
Modify: 2024-06-06 12:00:00.000000000 +0000
Change: 2024-06-06 12:00:00.000000000 +0000
Birth: -

8.2、ls命令

ls 命令用于列出目录内容。它有很多选项,可以显示文件的各种信息,如权限、所有者、大小和修改时间等。

显示详细信息:

ls -l

输出示例:

total 12
-rw-r--r-- 1 user user 1234 Jun  6 12:00 example.txt
drwxr-xr-x 2 user user 4096 Jun  6 12:00 documents
drwxr-xr-x 3 user user 4096 Jun  6 12:00 projects

示例参数说明:

  • ' - ':代表普通文件,即包含文本内容或二进制数据的文件。
  • ' d ':代表目录文件,用于存储其他文件或目录的容器。
  • ' c ':代表字符设备文件,用于与字符设备进行通信,如终端设备或串行端口。
  • ' b ':代表块设备文件,用于与块设备进行通信,如硬盘驱动器或磁盘分区。
  • ' l ':代表符号链接文件,用于指向其他文件或目录的路径。
  • ' s ':代表套接字文件,用于进程间通信,通常用于网络通信或本地通信。
  • ' p ':代表管道文件,用于进程间通信,允许单向数据流的传输。

通过使用这些命令,可以方便地查看文件和目录的详细信息,以便更好地管理和操作系统中的文件。

9、statfstatlstat函数

statfstatlstat 是Linux中用于获取文件属性的系统调用函数。它们的主要作用是读取文件的元数据,如文件大小、权限、所有者等。以下是这三个函数的详细说明、作用和使用方法。

  • stat:获取指定路径文件的属性信息,解析符号链接指向的文件。
  • fstat:获取通过文件描述符指定的文件的属性信息。
  • lstat:获取指定路径文件的属性信息,如果是符号链接,返回链接本身的属性。

这些函数在文件管理和系统编程中非常重要,能够帮助开发者获取文件的详细信息并进行相应处理。理解它们的用法和区别对于编写高效、健壮的程序至关重要。

在Linux中,statfstat、和lstat函数都使用同一个结构体struct stat来存储文件的元数据。这个结构体包含了文件的多种属性信息,如文件大小、文件类型、权限、所有者、时间戳等。

struct stat结构体定义在头文件<sys/stat.h>中。它的典型定义如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat {
    dev_t     st_dev;         /* 文件的设备ID */
    ino_t     st_ino;         /* 文件的索引节点号 */
    mode_t    st_mode;        /* 文件的类型和权限 */
    nlink_t   st_nlink;       /* 硬链接数 */
    uid_t     st_uid;         /* 所有者用户ID */
    gid_t     st_gid;         /* 所有者组ID */
    dev_t     st_rdev;        /* 特殊设备ID(如果此文件是设备文件) */
    off_t     st_size;        /* 文件大小,以字节为单位 */
    blksize_t st_blksize;     /* 文件系统I/O的块大小 */
    blkcnt_t  st_blocks;      /* 分配给此文件的512字节块的数量 */
    time_t    st_atime;       /* 最后一次访问时间 */
    time_t    st_mtime;       /* 最后一次修改时间 */
    time_t    st_ctime;       /* 最后一次状态改变时间(元数据) */
};

各字段的含义如下:

  • st_dev:表示文件所在设备的设备号。文件系统中,每个设备都有一个唯一的设备号。
  • st_ino:表示文件的索引节点号(inode number),它是文件在文件系统中的唯一标识。
  • st_mode:表示文件的类型和权限。使用位掩码可以提取出文件类型和权限信息。
  • st_nlink:表示文件的硬链接数量。一个文件可以有多个硬链接,它们共享同一个索引节点。
  • st_uid:表示文件所有者的用户ID。
  • st_gid:表示文件所有者的组ID。
  • st_rdev:如果文件是字符设备或块设备文件,则此字段表示设备号。
  • st_size:表示文件的大小,以字节为单位。
  • st_blksize:表示文件系统I/O的块大小。
  • st_blocks:表示分配给文件的512字节块的数量。
  • st_atime:表示文件最后一次访问的时间。
  • st_mtime:表示文件最后一次修改的时间。
  • st_ctime:表示文件最后一次状态改变的时间(例如,权限修改)。

9.1、stat函数

int stat(const char *path, struct stat *buf);

参数

  • path:文件路径。
  • buf:指向stat结构体的指针,用于存储文件属性信息。

返回值

  • 成功时返回0。
  • 失败时返回-1,并设置errno来指示错误。

作用: 获取指定路径文件的属性信息。

示例如下:

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>

int main() {
    struct stat fileStat;

    if (stat("example.txt", &fileStat) < 0) {
        perror("stat");
        return 1;
    }

    printf("File Size: %ld bytes\n", fileStat.st_size);
    printf("Number of Links: %lu\n", fileStat.st_nlink);
    printf("File inode: %lu\n", fileStat.st_ino);
    printf("File Permissions: ");
    printf((S_ISDIR(fileStat.st_mode)) ? "d" : "-");
    printf((fileStat.st_mode & S_IRUSR) ? "r" : "-");
    printf((fileStat.st_mode & S_IWUSR) ? "w" : "-");
    printf((fileStat.st_mode & S_IXUSR) ? "x" : "-");
    printf((fileStat.st_mode & S_IRGRP) ? "r" : "-");
    printf((fileStat.st_mode & S_IWGRP) ? "w" : "-");
    printf((fileStat.st_mode & S_IXGRP) ? "x" : "-");
    printf((fileStat.st_mode & S_IROTH) ? "r" : "-");
    printf((fileStat.st_mode & S_IWOTH) ? "w" : "-");
    printf((fileStat.st_mode & S_IXOTH) ? "x" : "-");
    printf("\n");

    return 0;
}

9.2、fstat函数

int fstat(int fd, struct stat *buf);

参数

  • fd:文件描述符。
  • buf:指向stat结构体的指针,用于存储文件属性信息。

返回值

  • 成功时返回0。
  • 失败时返回-1,并设置errno来指示错误。

作用: 获取通过文件描述符指定的文件的属性信息。

示例如下:

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    struct stat fileStat;
    int fd = open("example.txt", O_RDONLY);

    if (fd < 0) {
        perror("open");
        return 1;
    }

    if (fstat(fd, &fileStat) < 0) {
        perror("fstat");
        close(fd);
        return 1;
    }

    printf("File Size: %ld bytes\n", fileStat.st_size);
    printf("Number of Links: %lu\n", fileStat.st_nlink);
    printf("File inode: %lu\n", fileStat.st_ino);

    close(fd);
    return 0;
}

9.3、lstat函数

int lstat(const char *path, struct stat *buf);

参数

  • path:文件路径。
  • buf:指向stat结构体的指针,用于存储文件属性信息。

返回值

  • 成功时返回0。
  • 失败时返回-1,并设置errno来指示错误。

作用: 获取指定路径文件的属性信息,但如果路径是符号链接,返回链接本身的属性,而不是链接指向的文件。

示例如下:

#include <stdio.h>
#include <sys/stat.h>

int main() {
    struct stat fileStat;

    if (lstat("symlink", &fileStat) < 0) {
        perror("lstat");
        return 1;
    }

    printf("File Size: %ld bytes\n", fileStat.st_size);
    printf("Number of Links: %lu\n", fileStat.st_nlink);
    printf("File inode: %lu\n", fileStat.st_ino);
    printf("File Permissions: ");
    printf((S_ISLNK(fileStat.st_mode)) ? "l" : "-");
    printf((fileStat.st_mode & S_IRUSR) ? "r" : "-");
    printf((fileStat.st_mode & S_IWUSR) ? "w" : "-");
    printf((fileStat.st_mode & S_IXUSR) ? "x" : "-");
    printf((fileStat.st_mode & S_IRGRP) ? "r" : "-");
    printf((fileStat.st_mode & S_IWGRP) ? "w" : "-");
    printf((fileStat.st_mode & S_IXGRP) ? "x" : "-");
    printf((fileStat.st_mode & S_IROTH) ? "r" : "-");
    printf((fileStat.st_mode & S_IWOTH) ? "w" : "-");
    printf((fileStat.st_mode & S_IXOTH) ? "x" : "-");
    printf("\n");

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JS重点18】原型链(面试重点)

一&#xff1a;原型链底层原理 以下面一段代码为例&#xff0c;基于原型对象&#xff08;Star构造函数的原型对象&#xff09;的继承使得不同构造函数的原型对象关联在一起&#xff08;此处是最大的构造函数Object原型对象&#xff09;&#xff0c;并且这种关联的关系是一种链…

Java 集合框架:Vector、Stack 的介绍、使用、原理与源码解析

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 015 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

哈喽GPT-4o——对GPT-4o 编程的思考与看法

GPT-4o&#xff08;“o”代表“全能”&#xff09;它可以接受任意组合的文本、音频和图像作为输入&#xff0c;并生成任意组合的文本、音频和图像输出。 &#x1f449; GPT功能&#xff1a; GPT-4o知识问答&#xff1a;支持1000token上下文记忆功能最强代码大模型Code Copilo…

多线程(总结黑马程序员)

一、什么是线程&#xff1f; 是一个程序内部的一条执行流程 多线程是什么&#xff1f; 多条线程由CPU负责调度执行 多线程的创建方式一&#xff1a;继承Thread类 //1.继承Thread类 public class MyThread extends Thread {//2.必须重写run方法Overridepublic void run() {…

AI 音乐大模型:创新的曙光还是创意产业的阴影?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

课程品牌推广与传播秘籍:让你的课程火爆全网!

如今在线教育平台的竞争愈发激烈&#xff0c;如何让你的课程在茫茫网海中脱颖而出&#xff0c;吸引更多学员的关注和报名&#xff1f; 作为一名手工酸奶品牌的创始人&#xff0c;目前全国复制了100多家门店&#xff0c;很多都是线上授课。而且我自己还有一家传媒公司&#xff…

【C++题解】1670 - 象棋大赛

问题&#xff1a;1670 - 象棋大赛 类型&#xff1a;分支问题 题目描述&#xff1a; 市里要组织象棋大赛&#xff0c;年龄在 8∼30 周岁之间的选手可以报名参赛。为了公平起见&#xff0c;大赛组委会将选手们分了青年组、少年组和儿童组&#xff0c;大赛组委会规定&#xff1a…

heygen的前世今生

heygen 关于徐卓&梁望国内创业&诗云科技成立heygen为什么原班人马在国内做和国外做产品&#xff0c;造成的结果如此迥异&#xff1f;技术原理 关于徐卓&梁望 徐卓本科毕业于同济大学&#xff0c;硕士毕业于卡内基梅隆大学计算机专业&#xff0c;之后在 Snap 工作了…

ITSS案例分享 — 强化网络安全保障水平

某科技有限公司成立于2001年&#xff0c;是中国网络安全产业领跑者&#xff0c;于2000年发力安全业务&#xff0c;在云安全、身份安全、终端安全、态势感知、高级威胁治理&#xff0c;以及威胁情报领域等拥有多项全球领先技术&#xff0c;在核心技术领域持续领跑&#xff1b;同…

【每日刷题】Day70

【每日刷题】Day70 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 922. 按奇偶排序数组 II - 力扣&#xff08;LeetCode&#xff09; 2. 905. 按奇偶排序数组 - 力扣&…

【会议征稿,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会&#xff0c;广州番禺职业技术学院主办&#xff1b;全国区块链行业产教融合共同体&#xff0c;AEIC学术交流中心承办&#xff0c;将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…

瑞尼克RNK聚四氟乙烯注射器刻度清晰纯净

四氟注射器用于抽取或者注入气体或者液体&#xff0c;四氟注射器由前端带有小孔的针筒以及与之匹配的活塞芯杆组成&#xff0c;用来将少量的液体或其注入到其它方法无法接近的区域或者从那些地方抽出&#xff0c;在芯杆拔出的时候液体或者气体从针筒前端小孔吸入&#xff0c;在…

程控漏电流测试电阻箱的应用

程控漏电流测试电阻箱是用于测量和控制电流的设备&#xff0c;广泛应用于电力系统、电子设备、自动化设备等领域。它的主要功能是通过改变电阻值来控制电流的大小&#xff0c;从而实现对设备的保护和控制。 程控漏电流测试电阻箱在电力系统中有着重要的应用&#xff0c;电力系统…

数据分析第十讲:pandas 应用入门(五)

pandas 应用入门&#xff08;五&#xff09; 我们再来补充一些使用DataFrame做数据分析时会使用到的操作&#xff0c;这些操作不仅常见而且也非常重要。 计算同比环比 我们之前讲过一个统计月度销售额的例子&#xff0c;我们可以通过groupby方法做分组聚合&#xff0c;也可以…

火爆全网 LLM大模型教程:从零开始构建大语言模型,git突破18K标星

什么&#xff01;一本书的Github仓库居然有18.5k的星标&#xff01;&#xff08;这含金量不必多说&#xff09; 对GPT大模型感兴趣的有福了&#xff01;这本书的名字叫 《Build a Large Language Model (From Scratch)》 也就是 从零开始构建大语言模型&#xff01; 虽然这是一…

软件构造 | Equality in ADT and OOP

软件构造 | Equality in ADT and OOP &#x1f9c7;1 Three ways to regard equality 1.1 Using AF to define the equality ADT是对数据的抽象&#xff0c; 体现为一组对数据的操作 抽象函数AF&#xff1a;内部表示→抽象表示 基于抽象函数AF定义ADT的等价操作&#xff0…

MySQL----事务的隔离级别(附带每一级别实例截图)

先来回顾一下事务并发可能存在的三大问题&#xff1a; 脏读&#xff08;Dirty Read&#xff09;–不能接受 一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时&#xff0c;当事务A更新后&#xff0c;事务B查询读取到A尚未提交的数据&#xff0c;此时事务A…

探索客户端-服务器架构:网络应用和分布式系统的基石

目录 前言1 客户端-服务器架构概述1.1 客户端的角色1.2 服务器的角色 2 客户端-服务器架构的工作原理3 客户端-服务器架构的应用4 客户端-服务器架构的优缺点4.1 优点方面4.2 缺点方面 5 客户端-服务器架构的未来发展结语 前言 在当今信息技术飞速发展的时代&#xff0c;客户端…

【数据结构】第十八弹---C语言实现堆排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、堆排序 1.1、基本思想 1.2、初步代码实现 1.3、代码优化 1.4、代码测试 总结 1、堆排序 在博主数据结构第十二弹---堆的应用有详细讲解堆…

【SpringMVC】第1-7章

第1章 初始SpringMVC 1.1 学习本套教程前的知识储备 JavaSEHTMLCSSJavaScriptVueAJAX axiosThymeleafServletMavenSpring 1.2 什么是MVC MVC架构模式相关课程&#xff0c;在老杜的JavaWeb课程中已经详细的讲解了&#xff0c;如果没有学过的&#xff0c;可以看这个视频&…