Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示

简介:  1.依赖的头文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> 2.函数定义: //通过传入文件路径,struct stat结构体指针的方式 int stat(const char *path, struct stat *buf); //通过文件描述


1.依赖的头文件

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

2.函数定义:

//通过传入文件路径,struct stat结构体指针的方式

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

//通过文件描述符获取文件对应的属性。文件打开后这样操作
int fstat(int fd, struct stat *buf);

//通过文件描述符获取文件对应的属性。文件打开后这样操作
int lstat(const char *path, struct stat *buf);

说明:执行成功返回0,失败返回-1,错误代码存于errno

注意:

         给定一个path

         A:stat函数返回一个与此命名文件有关的信息结构

         B:fstat函数获得已在描述符filedes上打开的文件信息

         C:lstat函数类似于stat,但是当命名的文件时一个符号连接是,lstat返回该符号连接的有关信息,而不是由此符号链接引用的文件的信息

3.这些函数的功能是返回关于一个文件的信息;

   A:stat既有命令也有同名函数,用来获取文件的Inode里主要信息,stat跟踪符号链接

   B:lstat不跟踪符号链接

4.stat里面时间辨析

   atime(最近访问时间)

   mtime(最近更改时间):指最近修改文件内容的时间

   ctime(最近改动时间):指最近改动Innode的时间,要注意的是mtime信息是Innode中的一项,所以一旦它修改了,这一项也会修改

5.所有的这些系统调用后返回一个stat的结构体,这个结构体包括以下内容:

struct stat {
               dev_t     st_dev;         /* ID of device containing file   文件设备编号*/
               ino_t     st_ino;           /* inode number  节点号*/
               mode_t    st_mode;    /* protection  文件的类型和存取的权限*/
               nlink_t   st_nlink;        /* number of hard links  连到该文件的硬连接数目,刚建立的文件值为1*/
               uid_t     st_uid;           /* user ID of owner   用户ID*/
               gid_t     st_gid;           /* group ID of owner 组ID*/
               dev_t     st_rdev;        /* device ID (if special file)  (设备类型)若此文件尾设备文件,则为其设备编号*/
               off_t     st_size;          /* total size, in bytes  文件字节数(文件大小)*/
               blksize_t st_blksize;  /* blocksize for filesystem I/O   块大小(文件系统的I/O缓冲区大小),类型为unsigned long类型*/
               blkcnt_t  st_blocks;   /* number of 512B blocks allocated  ,分配的512字节的块数,类型为unsigned long类型*/
               time_t    st_atime;     /* time of last access 最后一个访问时间*/
               time_t    st_mtime;    /* time of last modification 最后更改的时间*/
               time_t    st_ctime;     /* time of last status change   inode的更改时间*/
           };

6.通过下面的宏(macros)定义文件类型,下面的st_mode域包括以下几个部分:

           S_ISREG(m)  is it a regular file?                                      是否是一个常规文件

           S_ISDIR(m)  directory?                                                    是否是一个目录

           S_ISCHR(m)  character device?                                      是否是一个字符设备

           S_ISBLK(m)  block device?                                              是否是一个块设备

           S_ISFIFO(m) FIFO (named pipe)?                                   是否是输入输出(管道)   

           S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)      是否是符号链接

           S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)              是否是socket

7.下面的flags为了这个st_mode域而定义的

           S_IFMT     0170000   bit mask for the file type bit fields   为bit域定义的位元掩码
           S_IFSOCK   0140000   socket                                          socket                                                        
           S_IFLNK    0120000   symbolic link                                  符号连接
           S_IFREG    0100000   regular file                                     常规文件
           S_IFBLK    0060000   block device                                   块设备
           S_IFDIR    0040000   directory                                          目录
           S_IFCHR    0020000   character device                            字符设备
           S_IFIFO    0010000   FIFO                                                先进先出


           S_ISUID    0004000   set-user-ID bit                                 文件的(set user-id on execution)位
           S_ISGID    0002000   set-group-ID bit (see below)           文件的(set group-id on execution)位
           S_ISVTX    0001000   sticky bit (see below)                      文件的sticky为


           S_IRWXU    00700     mask for file owner permissions     文件拥有者的掩码
           S_IRUSR    00400     owner has read permission             拥有者有读权限
           S_IWUSR    00200     owner has write permission            拥有者有写权限
           S_IXUSR    00100     owner has execute permission        拥有者有执行权限


           S_IRWXG    00070     mask for group permissions           组权限的掩码          
           S_IRGRP    00040     group has read permission             组有读权限

           S_IWGRP    00020     group has write permission            组有些权限
           S_IXGRP    00010     group has execute permission        组有执行权限


           S_IRWXO    00007     mask for permissions for others (not in group)      其它者(不在组中)的权限掩码
           S_IROTH    00004     others have read permission                                  其它者有读权限
           S_IWOTH    00002     others have write permission                                 其它者有写权限
           S_IXOTH    00001     others have execute permission                             其它者有执行权限

8.关于黏住位

          若一个目录具有sticky位(S_ISVTX) 则表示在此目录下的文件只能被文件所有者,次目录的所有者或者root来删除或修改

9.此外

struct statfs {
    long    f_type;           //文件系统类型
    long    f_bsize;         //块大小
    long    f_blocks;       //块多少
    long    f_bfree;         //空闲的块
    long    f_bavail;        //可用块
    long    f_files;           //总文件节点
    long    f_ffree;          //空闲文件节点
    fsid_t f_fsid;             //文件系统id
    long    f_namelen;    //文件名的最大长度
    long    f_spare[6];     //spare for later
};

10.stat()函数调用案例(通过程序的方式调用stat(),并且呈现 stat 结构体中的信息 )

运行结果:

目录
相关文章
|
2月前
|
存储 运维 数据挖掘
服务器数据恢复—EqualLogic存储硬盘出现坏道的数据恢复案例
某品牌EqualLogic PS6100存储阵列上有一组由16块硬盘组建的raid5磁盘阵列。磁盘阵列上层划分多个大小不同的卷,存放虚拟机文件。 硬盘出现故障导致存储阵列不可用,需要恢复存储阵列中的数据。
|
2月前
|
存储 运维 Oracle
服务器数据恢复—存储硬盘指示灯亮黄灯,RAID5阵列崩溃的数据恢复案例
服务器存储数据恢复环境: 某单位一台某品牌DS5300存储,1个机头+4个扩展柜,50块的硬盘组建了两组RAID5阵列。一组raid5阵列有27块硬盘,存放Oracle数据库文件。存储系统上层一共划分了11个卷。 服务器存储故障: 存储设备上两个硬盘指示灯亮黄色。其中一组RAID5阵列崩溃,存储不可用,设备已经过保。
|
3月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
294 137
|
5月前
|
存储 Oracle 关系型数据库
服务器数据恢复—光纤存储上oracle数据库数据恢复案例
一台光纤服务器存储上有16块FC硬盘,上层部署了Oracle数据库。服务器存储前面板2个硬盘指示灯显示异常,存储映射到linux操作系统上的卷挂载不上,业务中断。 通过storage manager查看存储状态,发现逻辑卷状态失败。再查看物理磁盘状态,发现其中一块盘报告“警告”,硬盘指示灯显示异常的2块盘报告“失败”。 将当前存储的完整日志状态备份下来,解析备份出来的存储日志并获得了关于逻辑卷结构的部分信息。
|
3月前
|
Unix 应用服务中间件 索引
服务器数据恢复—LUN映射出错导致文件系统共享冲突的数据恢复案例
SUN光纤存储系统中有一组由6个硬盘组建的RAID6,划分为若干LUN,MAP到跑不同业务的服务器上,这些服务器上运行的是SOLARIS操作系统。 服务器不存在物理故障。由于公司业务变化,需要增加一台服务器跑新的应用。服务器管理员在原服务器在线的状态下,将其中一个lun映射到一台新服务器上。实际上,这个刚映射过去的卷已经map到了solaris生产系统上的某个lun上了。映射到新服务器后,服务器对这个卷进行初始化的操作,原solaris系统上的磁盘报错,重启服务器后这个卷已经无法挂载。 服务器管理员寻求sun原厂工程师的帮助。sun工程师检测后执行了fsck操作。执行完成后文件系统挂载成功。查
|
3月前
|
运维 监控 Java
Linux常用命令行大全:14个核心指令详解+实战案例
在服务器管理与开发运维领域,Linux 指令是构建技术能力体系的基石。无论是日常的系统监控、文件操作,还是复杂的服务部署与故障排查,熟练掌握指令的使用逻辑都是提升工作效率的核心前提。然而,对于初学者而言,Linux 指令体系往往呈现出“参数繁多易混淆”“组合使用门槛高”“实际场景适配难”等痛点——例如 ls 命令的 -l 与 -a 参数如何搭配查看隐藏文件详情,grep 与管道符结合时如何精准过滤日志内容,这些问题常常成为技术进阶的阻碍。
|
3月前
|
存储 数据挖掘 Linux
服务器数据恢复—重装系统导致OceanStor存储上的分区无法访问的数据恢复案例
服务器存储数据恢复环境: 华为OceanStor某型号存储+扩展盘柜,存储中的硬盘组建了raid5磁盘阵列,上层分配了1个lun。 linux操作系统,划分了两个分区,分区一通过lvm扩容,分区二为xfs文件系统。 服务器存储故障: 工作人员重装系统操作失误导致磁盘分区变化,分区二无法访问,数据丢失。
|
4月前
|
弹性计算 安全 Linux
阿里云服务器ECS安装宝塔Linux面板、安装网站(新手图文教程)
本教程详解如何在阿里云服务器上安装宝塔Linux面板,涵盖ECS服务器手动安装步骤,包括系统准备、远程连接、安装命令执行、端口开放及LNMP环境部署,手把手引导用户快速搭建网站环境。
|
3月前
|
存储 数据挖掘 Windows
服务器数据恢复—RAIDZ上层ZFS文件系统数据恢复案例
一台服务器有32块硬盘,采用Windows操作系统。 服务器在正常运行的时候突然变得不可用。没有异常断电、进水、异常操作、机房不稳定等外部因素。服务器管理员重启服务器,但是服务器无法进入系统。管理员联系北亚企安数据恢复工程师要求恢复服务器数据。
|
4月前
|
存储 算法 数据挖掘
服务器数据恢复—昆腾存储StorNext文件系统数据恢复案例
一台昆腾存储设备中有一组raid5磁盘阵列。阵列上有两块硬盘先后离线,raid5磁盘阵列不可用。