0801|IO进程线程day4【stat获取文件属性】

news2024/11/15 18:03:11

目录

1 获取文件属性

1)stat

2)提取文件的权限

3)提取文件的类型

4)提取文件所属用户名【getpwuid函数】

5)提取文件所属组用户名【getgrgid函数】

6)完整代码:


1 获取文件属性

1)stat

功能:获取文件的属性;

原型:

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

       int stat(const char *pathname, struct stat *statbuf);

参数:

        char *pathname:指定要获取属性的文件路径以及名字;

        struct stat *statbuf:存储获取到的属性;

返回值:

        成功,返回0;

        失败,返回-1,更新errno;

结构体成员:

vi -t stat 或者 man手册往下翻

struct stat {
    	
        ino_t     st_ino;         /* Inode number */         inode号
		mode_t    st_mode;        /* File type and mode */   文件类型和权限
		nlink_t   st_nlink;       /* Number of hard links */ 硬链接数
		uid_t     st_uid;         /* User ID of owner */     用户的uid
		gid_t     st_gid;         /* Group ID of owner */    组用户的gid

		off_t     st_size;        /* Total size, in bytes */     文件大小


		struct timespec st_atim;  /* Time of last access */         最后一次被访问的时间
		struct timespec st_mtim;  /* Time of last modification */   最后一次被修改的时间
		struct timespec st_ctim;  /* Time of last status change */  最后一次改变状态的时间

#define st_atime st_atim.tv_sec      /* Backward compatibility */
#define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec
};

2)提取文件的权限

mode_t st_mode 本质上是一个unsigned int类型,里面存储了文件的类型和权限。

st_mode中其中低9bits存储了文件的权限:[0bit - 8bit]

mode: 0100664 ---> rw-rw-r--
        664----> 110 110 100 ---> 0664
                 100 000 000 ---> 0400
                 ------------
                 100 000 000 ===> 0400结果不等于0,需要打印'r'。否则打印'-'
                 
        664----> 110 110 100 ---> 0664
                 010 000 000 ---> 0200
                 ------------
                 010 000 000 ===> 0200结果不等于0,需要打印'w'。否则打印'-'
                 
        664----> 110 110 100 ---> 0664
                 001 000 000 ---> 0100
                 ------------
                 000 000 000 ===> 0000结果等于0,需要打印'-'。否则打印'x'

方法一:

void get_filePermission(mode_t m)
{
	if(m & 0400)	
		putchar('r');
	else
		putchar('-');				
	if(m & 0200)	
		putchar('w');
	else
		putchar('-');
	if(m & 0100)	
		putchar('x');
	else
		putchar('-');
///
	if(m & 0040)	
		putchar('r');
	else
		putchar('-');
	if(m & 0020)	
		putchar('w');
	else
		putchar('-');
	if(m & 0010)	
		putchar('x');
	else
		putchar('-');
/
	if(m & 0004)	
		putchar('r');
	else
		putchar('-');
	if(m & 0002)	
		putchar('w');
	else
		putchar('-');
	if(m & 0001)	
		putchar('x');
	else
		putchar('-');

}

方法二(2种循环):

void get_filePermission(mode_t m)   //mode_t m = buf.st_mode
{
    char buf[] = "rwx";

    for(int i=0; i<9; i++)
    {
        if( (m & (0400>>i)) == 0)
        {
            putchar('-');
            continue;
        }
        printf("%c", buf[i%3]);

        //能运行到当前位置,则代表对应位置有权限
        //需要判断是r w x中的哪一个
        /*
        switch(i%3)
        {
        case 0:
            putchar('r');
            break;
        case 1:
            putchar('w');                                   
            break;
        case 2:
            putchar('x');
            break;
        }
        */
    }
    return;
}

3)提取文件的类型

mode_t st_mode 本质上是一个unsigned int类型,里面存储了文件的类型和权限。

方法一:

man 2 stat --> st_mode --->see inode(7)
man 7 inode -->

           S_ISREG(m)  is it a regular file?                         -

           S_ISDIR(m)  directory?                                    d

           S_ISCHR(m)  character device?                             c

           S_ISBLK(m)  block device?                                 b

           S_ISFIFO(m) FIFO (named pipe)?                            p

           S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)        l

           S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)               s
若是该类型文件,则返回真,否则返回假

代码:

void get_fileType(mode_t m) 
{
    if(S_ISREG(m))
        putchar('-');

    else if(S_ISDIR(m))
        putchar('d');

    else if(S_ISCHR(m))
        putchar('c');       

    return ;

}

方法二:

mode       0040775
S_IFMT     0170000   bit mask for the file type bit field

mode       0040775 ---> 000 100 000 111 111 101
S_IFMT     0170000 ---> 001 111 000 000 000 000  &
                    ------------------------------
                        000 100 000 000 000 000 ---> 040000
与下列宏进行比较,与哪个相同,就是对应类型文件
           S_IFSOCK   0140000   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

mode:      0100664 ---> 001 000 000 110 110 100
S_IFMT     0170000 ---> 001 111 000 000 000 000  &
                    ------------------------------
                        001 000 000 000 000 000 ---> 0100000

代码:

void get_fileType(mode_t m)     //mode_t m = buf.st_mode
{   
    switch(m & S_IFMT)
    {
    case S_IFSOCK: putchar('s');    break;
    case S_IFLNK: putchar('l');     break;
    case S_IFREG: putchar('-');     break;
    case S_IFDIR: putchar('d');     break;
    }
    return;                                              
}

4)提取文件所属用户名【getpwuid函数】

uid_t st_uid; /* User ID of owner */ 用户的uid

getpwuid函数

功能:通过uid号获取用户的信息;

原型:

    #include <sys/types.h>
    #include <pwd.h>

    struct passwd *getpwuid(uid_t uid);

参数:

        uid_t uid:指定uid号;

返回值:

        成功,返回结构体指针;

        失败,返回NULL;更新errno;

结构体成员:

struct passwd {
               char   *pw_name;       /* username */
               char   *pw_passwd;     /* user password */
               uid_t   pw_uid;        /* user ID */
               gid_t   pw_gid;        /* group ID */
               char   *pw_gecos;      /* user information */
               char   *pw_dir;        /* home directory */
               char   *pw_shell;      /* shell program */
           };

代码:

struct passwd* pwd = getpwuid(buf.st_uid);
   if(NULL == pwd)
   {
       ERR_MSG("getpwuid");
       return -1;
   }
   printf("%s\n", pwd->pw_name);

5)提取文件所属组用户名【getgrgid函数】

gid_t st_gid; /* Group ID of owner */ 组用户的gid

功能:通过gid号获取组用户的信息;

原型:

    #include <sys/types.h>
    #include <grp.h>

    struct group *getgrgid(gid_t gid);

参数:

        gid_t gid:指定gid号;

返回值:

        成功,返回结构体指针;

        失败,返回NULL;更新errno;

 结构体成员:

struct group {
    char   *gr_name;        /* group name */
    char   *gr_passwd;      /* group password */
    gid_t   gr_gid;         /* group ID */
    char  **gr_mem;         /* NULL-terminated array of pointers
                               to names of group members */
};

代码:

 struct group* grp = getgrgid(buf.st_gid);
    if(NULL == grp)
    {                                             
        ERR_MSG("getgrgid");
        return -1;
    }
    printf("%s\n", grp->gr_name);

6)完整代码:

利用stat函数,打印类似ls -l的文件属性信息

方法一:

#include <stdio.h>
#include <head.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
int main(int argc, const char *argv[])
{
	struct stat buf;
	if(stat("./01_fileno.c",&buf) < 0 )
	{
		ERR_MSG("stat");
		return -1;
	}
	//文件的硬链接数
	printf("link:%ld\n", buf.st_nlink);
	//文件的所属用户
	printf("uid:%d\n", buf.st_uid);
	//文件所属组用户
	printf("gid:%d\n", buf.st_gid);
	//文件大小
	printf("size:%ld\n", buf.st_size);
	//文件的修改时间
	printf("time:%ld\n", buf.st_ctime);
	//struct tm* info=NULL;
	//info=localtime(&buf.st_mtime);
	//printf("%d-%02d-%0d %02d:%02d:%02d\n", info->tm_year+1900, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, info->tm_sec);
	//文件的名字

	return 0;
}

方法二:

#include <stdio.h>
#include <head.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
void get_filePermission(mode_t m)
{
	char buf[]="rwx";
	for(int i=0;i<9;i++)
	{
		if( (m & (0400)>>i) == 0)
		{
			putchar('-');
			continue;
		}
		printf("%c",buf[i%3]);
	}
	putchar(' ');
}

void get_fileType(mode_t m)
{
	/*
	   if(S_ISREG(m))
	   putchar('-');
	   else if(S_ISDIR(m))
	   putchar('d');
	   else if(S_ISCHR(m))
	   putchar('c');
	   else if(S_ISBLK(m))
	   putchar('b');
	   else if(S_ISFIFO(m))
	   putchar('p');
	   else if(S_ISLNK(m))
	   putchar('l');
	   else if(S_ISSOCK(m))
	   putchar('s');
	   */
	switch(m & S_IFMT)
	{
	case S_IFSOCK: putchar('s');    break;
	case S_IFLNK: putchar('l');     break;
	case S_IFREG: putchar('-');     break;
	case S_IFDIR: putchar('d');     break;	
	}
	return;
}
int main(int argc, const char *argv[])
{
	
	struct stat buf;
	if(stat("./01_fileno.c",&buf) < 0 )
	{
		ERR_MSG("stat");
		return -1;
	}
	
	//文件的类型和权限
	get_fileType(buf.st_mode);
	get_filePermission(buf.st_mode);
	//时间
	struct tm* info=NULL;
	info=localtime(&buf.st_mtime);
	//文件的所属用户
	struct passwd* pwd=getpwuid(buf.st_uid);
	if(NULL == pwd)
	{
		ERR_MSG("getpwuid");
		return -1;
	}
	//文件所属组用户
	struct group* grp=getgrgid(buf.st_gid);
	if(NULL == grp)
	{
		ERR_MSG("getgrgid");
		return -1;
	}
	printf("%ld %s %s %ld %d月 %d %02d:%02d\n", buf.st_nlink, pwd->pw_name, grp->gr_name, buf.st_size,  info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min);
	
	//文件的名字

	return 0;
}

 

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

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

相关文章

error: #5: cannot open source input file “core_cmInstr.h“

GD32F103VET6和STM32F103VET6引脚兼容。 GD32F103VET6工程模板需要包含头文件&#xff1a;core_cmInstr.h和core_cmFunc.h&#xff0c;这个和STM32F103还是有区别的&#xff0c;否则会报错&#xff0c;如下&#xff1a; error: #5: cannot open source input file "core…

AI 3D结构光技术加持,小米引领智能门锁新标准

一直以来&#xff0c;小米智能门锁系列产品让更多家庭走进了安全便捷的智能生活&#xff0c;安全至上的设计让很多家庭都轻松告别了随身钥匙。 7月27日&#xff0c;小米正式推出小米智能门锁M20 Pro&#xff0c;再一次引领智能门锁产品的发展潮流。该款门锁采用AI 3D结构光技术…

算法竞赛入门【码蹄集新手村600题】(MT1080-1100)

算法竞赛入门【码蹄集新手村600题】(MT1080-1100&#xff09; 目录MT1081 xy的和MT1082 x-y的和MT1083 向下取整MT1084 k次方根MT1085 分期付款MT1086 公里转换为米MT1087 温度转换MT1088 温度对照MT1089 整理玩具MT1090 卡罗尔序列MT1091 合并||MT1092 非常大的NMT1093 序列MT…

C语言每日一题:10.不使用+-*/实现加法+找到所有数组中消失的数。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 1.两个数二进制之间进行异或如果不产生进位操作那么两个数的和就是就是两个数进行异或的结果。 举例&#xff1a;5&#xff08;0101&#xff09;2&#xff08;0010&#xff09;进行异或等于&#xff1a;7&#xf…

Jmeter —— jmeter接口自动化测试操作流程

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

2023年华数杯建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#x…

多人任务管理,如何做好任务管理,任务管理软件

任务管理&#xff0c;简单易懂&#xff0c;就是对任务进行管理。那怎么可以更好进行任务管理呢&#xff1f;怎么样样可以让任务进度可视化&#xff0c;一目了然呢&#xff1f;有效的管理可以让我们事半功倍。 接下来我们看一下如何借助任务管理软件高效的做任务管理。 首先创…

python dataframe a.combine_first(temp) # 一张表的缺失值用另一张表填充

将a的索引和temp的索引设置为一样&#xff0c;再进行缺失值填充&#xff0c;combine_first会对所有同名的column进行填充。 a.combine_first(temp)

2.04 商品搜索功能实现

根据关键字获取分类查询对应的分页商品信息&#xff0c;并可以价格和销量进行排序切换 步骤1&#xff1a;mapper.xml编写sql语句 <!-- k: 默认&#xff0c;代表默认排序&#xff0c;根据name--> <!-- c: 根据销量排序--> <!-- p: 根据价格排序--> <sel…

【C++基础(六)】类和对象(中) --拷贝构造,运算符重载

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C初阶之路⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 类和对象 1. 前言2. 拷贝构造函数2.1 对拷贝构造函数…

Approximating Wasserstein distances with PyTorch学习

https://github.com/dfdazac/wassdistance/tree/master 前置知识 Computational optimal transport学习 具体看到熵对偶的坐标上升那就行 L C ε ( a , b ) def. min ⁡ P ∈ U ( a , b ) ⟨ P , C ⟩ − ε H ( P ) \mathrm{L}_{\mathbf{C}}^{\varepsilon}(\mathbf{a}, \m…

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法

Kafka系列之:记录一次Kafka Topic分区扩容,但是下游flink消费者没有自动消费新的分区的解决方法 一、背景二、解决方法三、实现自动发现新的分区一、背景 生产环境Kafka集群压力大,Topic读写压力大,消费的lag比较大,因此通过扩容Topic的分区,增大Topic的读写性能理论上下…

【RabbitMQ(day4)】SpringBoot整合RabbitMQ与MQ应用场景说明

一、SpringBoot 中使用 RabbitMQ 导入对应的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>配置配置文件 spring:application:name: rabbitmq-springbo…

云原生落地实践的25个步骤

一、什么是云原生&#xff1f; 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的&#xff0c;传统的应用必须跑在本地服务器上&#xff0c;现在流行的应用都跑在云端&#xff0c;云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思&#xff0c;我们在开始…

【Docker】Docker+Zipkin+Elasticsearch+Kibana部署分布式链路追踪

文章目录 1. 组件介绍2. 服务整合2.1. 前提&#xff1a;安装好Elaticsearch和Kibana2.2. 再整合Zipkin 点击跳转&#xff1a;Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套&#xff08;质量有保证&#xff0c;内容详情&#xff09; 本文主要讨论在Ela…

Spring Security OAuth2.0(7):自定义认证连接数据库

自定义认证连接数据库 首先创建数据库和用户表 CREATE TABLE t_user (id bigint(20) NOT NULL AUTO_INCREMENT,username varchar(64) DEFAULT NULL,password varchar(64) DEFAULT NULL,fullname varchar(255) DEFAULT NULL,mobile varchar(20) DEFAULT NULL,PRIMARY KEY (id)…

【vue】组件使用教训

组件使用 报错组件找不到 These dependencies were not found: 遇见的问题 在使用vue的时候&#xff0c;做了一个统计图的功能&#xff0c;引入了chart。 但是在运行项目的时候&#xff0c;直接报错启动不起来&#xff0c;报错内容是 告诉我依赖找不到&#xff0c;然后还试…

2023年华数杯建模思路 - 案例:退火算法

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&#xff0c;退火&#xff08;annealing&#xff09;现象指物体逐渐降温的物理现象&#xff0c;温度愈低&#…

医疗知识图谱问答 ——Neo4j 基本操作

前言 说到问答机器人&#xff0c;就不得不说一下 ChatGPT 啦。一个预训练的大预言模型&#xff0c;只要是人类范畴内的知识&#xff0c;似乎他回答得都井井有条&#xff0c;从写文章到写代码&#xff0c;再到解决零散琐碎的问题&#xff0c;不光震撼到我们普通人&#xff0c;就…

重生之我要学C++第一天

我重生了&#xff0c;今天开始带着上世纪的回忆重新学习C 目录 命名空间&#xff08;namespace&#xff09; 输入输出流 缺省参数&#xff08;默认参数&#xff09; 函数重载 命名空间&#xff08;namespace&#xff09; 新定义命名空间是C为防止对变量&#xff0c;函数&am…