stat函数(stat、fstat、lstat)

article/2025/10/8 15:49:30

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>     //需包含头文件

有如下三个函数的函数原型:

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

第一个形参:指出文件(文件路径); 第二个形参:出参数(函数对该参数操作,然后传出)。

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

fstat函数与stat函数的功能一样,只是第一个形参是文件描述符。

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

lstat函数的形参跟stat函数的形参一样。其功能也跟stat函数功能一样,仅有一点不同:stat函数是穿透(追踪)函数,即对软链接文件进行操作时,操作的是链接到的那一个文件,不是软链接文件本身;而lstat函数是不穿透(不追踪)函数,对软链接文件进行操作时,操作的是软链接文件本身。

以上三个函数:成功返回0,失败返回-1,并且将详细错误信息赋值给errno全局变量。

其它Linux系统函数类似,带l表示不追踪,不带l表示追踪(穿透)。如:ls –l命令查看的文件属性,是不追踪(不穿透)的;rm删除文件时,是不追踪的;Vi和Vim是穿透的;对于穿透的命令,是无法判断文件是不是软链接文件,比如ls –l命令,其是不穿透的,因此可以判断是否是软链接文件;如果是用stat函数实现的ls –l命令,则是穿透的,对于查看原文件和链接文件的属性是一样的,无法区别两者,因此可以考虑用lstat函数来实现ls –l命令的功能。

注意:创建软链接最好用绝对路径  ln –s 原文件 软链接文件(采用绝对路径)

statlstatfstat函数中 struct stat类型的说明:

struct stat {

               dev_t     st_dev;     /* 文件的设备编号 */

               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;    /* 设备类型(若此文件为设备文件,则为设备编号*/

               off_t      st_size;    /* 文件大小*/

               blksize_t   st_blksize; /*文件系统的I/O缓冲区大小*/

               blkcnt_t   st_blocks;  /* 块数 */

               time_t    st_atime;   /* 访问时间 */

               time_t    st_mtime;   /* 修改时间 */

               time_t    st_ctime;   /* 更改时间 */

         };  //标红为重点内容

struct stat结构体位于inode(索引结点)中,但是其内部不包含文件名。文件名位于位于文件的目录项dentry中(即简化的FCB),其包含文件名和inode编号。通过denty的inode编号可以找到inode,进一步找到文件本身。硬链接就是denty(目录项)。

上述结构体中,对st_mode成员做一个详细的介绍:

mode_t    st_mode;    /* 文件类型和权限*/

st_mode变量(mode_t类型):该变量占 2byte共16位,为16位的整型值。用于储存文件类型和权限。 如下图所示:

每一位均为二进制数。r代表4,即100;w代表2,即010;x代表1,即001。由于总共16位二进制数,因此需要6位8进制数来进行表示,其中8进制数以0开头,共7位。

其他人权限(0~2位)。读权限:0000004,在所给函数头文件中进行了宏定义为:S_IROTH;写:0000002,S_IWOTH;执行:0000001,S_IXOTH。 掩码为:0000007,S_IRWXO  掩码的作用:st_mode & 掩码 就可以过滤st_mode中除其他人权限以外的信息,所得结果直接是其他人的权限信息,下面原理相同。

所属组权限(3~5位)。读权限:0000040, S_IRGRP;写:0000020,S_IWGRP;执行:0000010,S_IXGRP。 掩码为:0000070,S_IRWXG。

所属主权限(6~8位)。读权限:0000400, S_IRUSR;写:0000200,S_IWUSR;执行:0000100,S_IXUSR。 掩码为:0000700,S_IRWXU。

特殊权限位(9~11位)。SUID:0004000, S_ISUID;SGID:0002000,S_ISGID;SBIT:0001000,S_ISVTX。 //特殊权限位很少用

文件类型(12~15位,共7种类型文件)。套接字(socket)文件s:0140000,S_IFSOCK;链接文件(软链接)l:0120000,S_IFLNK;普通文件-:0100000,S_IFREG;块设备文件b:0060000,S_IFBLK;目录文件d:0040000,S_IFDIR;字符设备文件c:0020000,S_IFCHR;管道文件p:0010000,S_IFIFO。    掩码:0170000  作用一样,st_mode & 掩码 的结果与七种类型的宏相比较,就可以判断是哪一种文件。

强调一下特殊权限位SBIT(粘滞位)的功能:1.对目录设置粘滞位,则该目录内的文件只能被文件所有者、超级用户和目录所有者这三类用户删除,其他用户都没有删除的权限;2.对文件设置了粘滞位,那么在内存资源十分紧张的情况下,也不会把该文件放回到磁盘上。如磁盘的对换区SWAP,当内存紧张,优先级别低的进程会被暂时放回到对换区中,但是一旦设置了粘滞位,则不会放回磁盘,依然处于内存。

下面是说明stat函数的使用的代码:

//运用stat函数实现查看文件大小属性的功能

[root@localhost work]# vim statuse.c

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main( int argc,char *argv[ ] )   //命令行参数
{if( argc < 2 )printf("./statuse filename1 filename2 ...\n");struct stat zsx;int ret;int i=1;for( i=1;i<argc;i++ ){ret = stat( argv[i],&zsx);   //stat函数获取文件的属性,穿透的if( ret == -1 ){perror("stat filename");exit(1);}int size = (int)zsx.st_size;   //注意,必须强制转换,后者变量是off_t类型printf("%s      %d\n",argv[i],size);}return 0;
}

[root@localhost work]# gcc -pipe -ggdb3 -pedantic -Wall statuse.c -o statuse

[root@localhost work]# ls

english.txt  ls-l.c  stat.c  statuse  statuse.c

[root@localhost work]# ./statuse english.txt ls-l.c stat.c statuse statuse.c

english.txt      109055

ls-l.c       2204

stat.c       416

statuse     57468

statuse.c  535

 [root@localhost work]# ll english.txt

-rwxrwxrwx. 1 root root 109055 Mar 19 10:30 english.txt

//运用stat函数实现ls –l 命令的功能

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>int main(int argc, char* argv[])
{if(argc < 2)int main(int argc, char* argv[])
{if(argc < 2){printf("./a.out filename\n");exit(1);}struct stat st;int ret = stat(argv[1], &st);if(ret == -1){perror("stat");exit(1);}// 存储文件类型和访问权限char perms[11] = {0};// 判断文件类型switch(st.st_mode & S_IFMT){case S_IFLNK:perms[0] = 'l';break;case S_IFDIR:perms[0] = 'd';break;case S_IFREG:perms[0] = '-';break;case S_IFBLK:perms[0] = 'b';break;case S_IFCHR:perms[0] = 'c';break;case S_IFSOCK:perms[0] = 's';break;case S_IFIFO:perms[0] = 'p';break;default:perms[0] = '?';break;}// 判断文件的访问权限// 文件所有者perms[1] = (st.st_mode & S_IRUSR) ? 'r' : '-';perms[2] = (st.st_mode & S_IWUSR) ? 'w' : '-';perms[3] = (st.st_mode & S_IXUSR) ? 'x' : '-';// 文件所属组perms[4] = (st.st_mode & S_IRGRP) ? 'r' : '-';perms[5] = (st.st_mode & S_IWGRP) ? 'w' : '-';perms[6] = (st.st_mode & S_IXGRP) ? 'x' : '-';// 其他人perms[7] = (st.st_mode & S_IROTH) ? 'r' : '-';perms[8] = (st.st_mode & S_IWOTH) ? 'w' : '-';perms[9] = (st.st_mode & S_IXOTH) ? 'x' : '-';// 硬链接计数int linkNum = st.st_nlink;// 文件所有者char* fileUser = getpwuid(st.st_uid)->pw_name;// 文件所属组char* fileGrp = getgrgid(st.st_gid)->gr_name;// 文件大小int fileSize = (int)st.st_size;// 修改时间char* time = ctime(&st.st_mtime);char mtime[512] = {0};strncpy(mtime, time, strlen(time)-1);char buf[1024];sprintf(buf, "%s  %d  %s  %s  %d  %s  %s", perms, linkNum, fileUser, fileGrp, fileSize, mtime, argv[1]);printf("%s\n", buf);return 0;
}

 


http://chatgpt.dhexx.cn/article/Qiy0kPfj.shtml

相关文章

stat函数

文章目录 (一)struct stat 结构体(二) st_mode 变量(三) struct timespec 结构体 Linux 下可以使用 stat 命令查看文件的属性&#xff0c;其实这个命令内部就是通过调用 stat()函数来获取文件属性的&#xff0c;stat 函数是 Linux 中的系统调用&#xff0c;用于获取文件相关的信…

Linux命令之stat命令

一、stat命令简介 stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。stat命令可以查看的信息包括&#xff1a; File&#xff1a;显示文件名Size&#xff1a;显示文件大小Blocks&#xff1a;文件使用的数据块总数IO Block&#xff1a;IO块大小r…

面经 - 计算机网络知识点

文章目录 资料协议层次应用层HTTP缓存机制强制缓存对比缓存 HTTP无状态Cookie & Sessioncookiesession DNS解析HTTP方法keep-alive和非keep-alive区别HTTP长连接和短连接HTTP方法GET和POST区别HTTP和HTTPS从地址栏输入URL到显示页面都发生了什么? HTTP3.0&#xff08;可靠…

计算机网络期末总复习知识点

概述 互联网的2个重要基本特点&#xff1a;连通性&#xff08;connectivity&#xff09;和资源共享&#xff08;sharing&#xff09;。端系统之间的两种通信方式&#xff1a;客户/服务器方式&#xff08;Client/Server方式、C/S方式&#xff09;、对等方式&#xff08;Peer to…

计算机网络基础知识点

1.网络介绍 由通信介质将地理位置不同、相互独立的计算机连接起来&#xff0c;实现数据和资源共享。 2.网络分类 2.1 按照拓扑结构分类 1.总线型 &#xff08;一根线上串好多计算机&#xff09;特点&#xff1a;两端信号终结器&#xff0c;分叉处有T型头 2.环形 网络效率…

计算机网络知识点总结-第一章:概述

1.计算机网络在信息时代的作用 互联网基本特点&#xff1a; 连通性&#xff1a;互联网上用户不管距离多远&#xff0c;都能通信&#xff0c;就像这些用户终端都彼此连通 共享性&#xff1a;指资源共享&#xff0c;包含信息、软件、硬件等共享&#xff0c;就像资源在用户身边 计…

计算机网络知识总结

目录 一&#xff1a;计算机网络分类 二&#xff1a;网络拓扑结构 三&#xff1a;ISO/OSI模型&#xff08;七层模型&#xff09; 四&#xff1a;五层模型 五&#xff1a;五层模型和七层模型对比 六&#xff1a;TCP/IP协议族 一&#xff1a;计算机网络分类 局域网&#xff…

计算机网络期末考试知识点汇总

一、TCP五层协议 1.体系结构 2.各层功能&#xff08;精简版&#xff09; 应用层:为应用程序提供各种功能&#xff0c;有各种协议表示层:数据格式转化&#xff0c;数据编码&#xff0c;解压&#xff0c;解密等会话层:建立&#xff0c;管理&#xff0c;维护会话&#xff0c;流量…

计算机网络知识整理-计算机网络概述(计算机网络入门参考指南)

第1章 计算机网络概述 1.1为什么要学习计算机网络 在当前的互联网时代&#xff0c;计算机网络已经成为了我国的一项重要的通信基础设施&#xff0c;无论是你是在校的计算机专业大学生&#xff0c;还是正在从事网络相关工作的从业人员&#xff0c;计算机网络的学习都是十分重要…

计算机网络知识点复习(适合春招面试复习)

计算机网络知识点 HTTP协议HTTP协议各版本之间的区别**HTTP1.0默认是短链接。****HTTP1.1默认持久连接。****HTTP2.0****HTTP3.0** HTTPS的过程HTTP是如何保存用户状态&#xff0c;Cookie和Session OSI体系结构TCP的三次握手和四次挥手三次握手四次挥手2MSL时间SYN泛洪攻击解决…

计算机网络知识点汇总(谢希仁 第七版)

目录 第一章 概述 重要内容 计算机网络的一些相关知识 互联网概述 因特网的标准化工作 互联网的组成 计算机网络的类别 计算机网络的性能指标 计算机网络的体系结构——-分层次的体系结构 第二章 物理层 重要内容 物理层的基本概念 数据通信的基本知识 信道复用技…

计算机网络知识点全面总结(有这一篇就够了!!!)

一、计算机网络概述 1.1 计算机网络的分类 按照网络的作用范围&#xff1a;广域网&#xff08;WAN&#xff09;、城域网&#xff08;MAN&#xff09;、局域网&#xff08;LAN&#xff09;&#xff1b; 按照网络使用者&#xff1a;公用网络、专用网络。 1.2 计算机网络的层次结…

计算机网络基本知识汇总

概述 OSI分层&#xff08;7层&#xff09; 物理层、数据链路层、网络层、运输层、会话层、表示层、应用层 TCP/IP分层&#xff08;4层&#xff09; 网络接口层、网络层、运输层、应用层 五层协议&#xff08;5层&#xff09; 物理层、数据链路层、网络层、运输层、应用层…

计算机网络知识

计算机网络的组成 IP&#xff1a; ip地址是有网络地址【前面部分】主机地址【后面部分】组成子网掩码&#xff1a;子网掩码和ip地址做&与运算&#xff0c;结果和ip一致的部分就是网络地址&#xff0c;结果不一致的表示网段范围默认网关&#xff1a;默认网关相当于你路由的…

计算机网络知识点汇总(王道)

目录 第 1 章 计算机网络概述 1.1 计算机网络的组成 1.2 计算机网络的分类 1.3 性能指标 1.3.1 带宽 1.3.2 吞吐量 1.3.3 时延 1.3.4 时延带宽积(链路容量) 1.3.5 往返时延RTT​ 1.3.6 利用率 1.4 分层结构 1.4.1 OSI参考模型&#xff08;7层&#xff09; 1.4.2 T…

计算机网络知识点总结提纲(谢希仁)

1、IOS/OSI对王道书上的缩减总结 (清晰pdf&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1f6DqMsHky4kP8i9WQLvCew?pwdthe3 提取码&#xff1a;the3 --来自百度网盘超级会员V3的分享) 2、王道书上物理层讲解的个人领悟之&#xff1a;奈氏准则和香浓定理 2.1 产生原…

计算机网络——计算机网络知识脑图

摘要 本博文主要分享计算机网络相关知识脑图&#xff0c;帮助大家更好的深入学习计算机网络相关知识&#xff0c;同时也介绍博主计算机网络专栏相关博文。同时介绍计算机网络学习书籍&#xff0c;有需要的小伙伴请自取。如果你觉得有用的话&#xff0c;请关注我的博客。 计算机…

计算机网络知识点总结

文章目录 一、概念1、什么是计算机网络&#xff1f;2、计算机网络协议、接口和服务的概念3、OSI与TCP/IP各层的结构与功能 二、物理层三、数据链路层四、网络层1、动态路由算法&#xff1a;距离-向量路由算法和链路状态路由算法2、网络地址转换&#xff08;NAT&#xff09;3、地…

计算机网络知识汇总(超详细整理)

文章目录 前言一、计算机网络概述1 互联网的构成2.网络分类3.接入网4.网络核心的两大功能①路由②转发 5.网络分层①OSI 7层模型②TCP/IP 4层模型③两种模型比较 二、物理层1.物理介质①引导型介质②非引导型介质 2.数据交换方式①分组交换②电路交换 3.信道复用①频分复用②时…