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);

//通过文件描述符获取文件对应的属性。文件打开后这样操作
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 结构体中的信息 )

运行结果:

时间: 2024-08-29 07:57:28

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

Linux服务器开发之:chmod()函数,chmod命令,以及文件屏蔽umask命令,程序修改umask,详细介绍+案例演示

 1.依赖的头文件 #include<sys/stat.h> 2.函数定义: //通过传入path中给定的文件名的方式来改变文件制定的权限 int chmod(const char *path,mode_t mode); //通过传入文件描述符的方式为一个文件重设权限 int fchmod(int fd,mode_t mode); 注意:如果使用Linux的chmod命令时,得有root权限 3.关于mode_t的定义:   A:mode_t的定义实际就是unsigned int 形式的

ArcGIS Engine开发之旅04---ARCGIS接口详细说明

原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.      IFieldEdit接口(esriGeoDatabase)... 2 3.      IFields接口(esriGeoDatabase)... 2 4. IRow接口(esriGeoDatabase)... 3 5. ITable接口(esriGeoDatabase)... 3 6. IAr

Linux 系统逻辑盘卷管理LVM 详细介绍

转 Linux 系统逻辑盘卷管理LVM 详细介绍一.前言每个Linux 使用者在安装Linux 时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值.因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统.清除硬盘.重新对硬盘分区,然后恢复数据到新分区.虽然现在有很多动态调整磁盘的工具可以使用,例如Partation Magic 等等,但是它并不能完全解决问题,因为某

【原创】服务器开发之 Daemon 和 Keepalive

      由于业务开发需要,需要对数据库代理进行研究,在研究 MySQL Proxy 实现原理的过程中,对一些功能点进行了分析总结.本文主要讲解下 MySQL Proxy 的 daemon 和 keepalive 功能实现原理.       MySQL Proxy 是数据库代理实现中的一种,提供了 MySQL server 与 MySQL client 之间的通信功能.由于 MySQL Proxy 使用的是 MySQL网络协议,故其可以在不做任何修改的情况下,配合任何符合该协议的且与 MySQ

Linux 下的五种 IO 模型详细介绍_Linux

概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空

Linux学习笔记之文件服务Vsftp详细介绍

知识点: 1.FTP使用TCP连接和TCP端口 2.在进行通信时,FTP需要建立两个TCP连接: 一个用于控制信息,TCP端口号缺省为21 一个用于数据传输,TCP端口号缺省为20 3.Vsftp是一个基于GPL发布的类Unix系统上的FTP服务器 4.其名称中的VS即"Verysecure"的意思,可见安全性高. 配置: 1.查看是否安装了Vsftp #rpm –qa vsftpd 2.安装 放入第三张光盘 #mount /mnt/cdrom #cd /mnt/cdrom/RedHa

在Linux系统中的时间转化方法详细介绍

  Linux时间转化方法: (1)date -d"2008年 12月 17日 星期三 17:27:22 CST" +"%s" 该命令将2008年 12月 17日 星期三 17:27:22 CST转化为时间戳 结果:1229515680 (2)将时间戳1123495443 换算成可以识别的年月日分秒 date -d '1970-01-01 UTC 1123495443 seconds' 结果:2005年 08月 08日 星期一 18:04:03 CST (3)dat

Linux下的Grep命令使用方法详细介绍_unix linux

1. grep简介  grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.Unix的grep家族包括grep. egrep和fgrep.egrep和fgrep的命令只跟grep有很小不同.egrep是grep的扩展,支持更多的re元字符, fgrep就是 fixed grep或fast grep,它们把所有的

linux 用户和组命令整理及详细介绍_Linux

1.列出当前系统上所有已经登录的用户名,注意:同一个用户登录多次,则只显示一次即可. [root@node2 ~]# who root pts/0 2016-10-08 13:28 (10.106.64.41) root pts/1 2016-10-08 13:44 (10.106.64.41) root pts/2 2016-10-08 14:22 (10.106.65.82) root pts/3 2016-10-08 14:22 (10.106.65.82) root pts/4 2016