【内核文件系统】源码阅读stat.h

Linux文件系统核心:inode结构深度解析与实战应用 在Linux和Unix-like操作系统中,文件系统是管理存储设备上数据组织的核心机制。其基本原理是通过元数据(metadata)来描述和管理文件,而非直接操作文件名。inode(索引节点)正是这一原理的关键实现,它是文件系统中用于存储文件元数据(如权限、所有者、大小、时间戳及数据块位置)的数据结构。理解inode的工作原理对于掌握文件链接(硬链接与软链接)、文件删除与空间释放、以及虚拟文件系统(VFS)的统一抽象层至关重要。其技术价值在于,它是实现“一切皆文件”哲学、保障数据一致性和高效I/O操作的基础。 阅读详情

1.源码

本代码对应的内核版本是4.15.1
在我的电脑中的位置是:
E:\004-代码\002-内核源码\linux-4.15.1\linux-4.15.1\include\uapi\linux\stat.h
源码如下:


/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI_LINUX_STAT_H
#define _UAPI_LINUX_STAT_H

#include <linux/types.h>

#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)

#define S_IFMT  00170000
#define S_IFSOCK 0140000   SOCKET文件
#define S_IFLNK	 0120000   连接
#define S_IFREG  0100000   常规文件
#define S_IFBLK  0060000   块设备
#define S_IFDIR  0040000   目录
#define S_IFCHR  0020000   字符设备
#define S_IFIFO  0010000   FIFO文件
#define S_ISUID  0004000   
#define S_ISGID  0002000
#define S_ISVTX  0001000

/*

#define S_IFMT  00170000      1111 0000 0000 0000
#define S_IFSOCK 0140000      1100 0000 0000 0000
#define S_IFLNK	 0120000      1010 0000 0000 0000
#define S_IFREG  0100000      1000 0000 0000 0000
#define S_IFBLK  0060000      0110 0000 0000 0000
#define S_IFDIR  0040000      0100 0000 0000 0000 
#define S_IFCHR  0020000      0010 0000 0000 0000 
#define S_IFIFO  0010000      0001 0000 0000 0000 
#define S_ISUID  0004000      0000 1000 0000 0000
#define S_ISGID  0002000      0000 0100 0000 0000
#define S_ISVTX  0001000      0000 0010 0000 0000

*/

#define S_ISLNK(m)	(((m) & S_IFMT) == S_IFLNK)
#define S_ISREG(m)	(((m) & S_IFMT) == S_IFREG)
#define S_ISDIR(m)	(((m) & S_IFMT) == S_IFDIR)
#define S_ISCHR(m)	(((m) & S_IFMT) == S_IFCHR)
#define S_ISBLK(m)	(((m) & S_IFMT) == S_IFBLK)
#define S_ISFIFO(m)	(((m) & S_IFMT) == S_IFIFO)
#define S_ISSOCK(m)	(((m) & S_IFMT) == S_IFSOCK)

#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

#endif

/*
 * Timestamp structure for the timestamps in struct statx.
 *
 * tv_sec holds the number of seconds before (negative) or after (positive)
 * 00:00:00 1st January 1970 UTC.
 *
 * tv_nsec holds a number of nanoseconds (0..999,999,999) after the tv_sec time.
 *
 * __reserved is held in case we need a yet finer resolution.
 */
struct statx_timestamp {
	__s64	tv_sec;
	__u32	tv_nsec;
	__s32	__reserved;
};

/*
 * Structures for the extended file attribute retrieval system call
 * (statx()).
 *
 * The caller passes a mask of what they're specifically interested in as a
 * parameter to statx().  What statx() actually got will be indicated in
 * st_mask upon return.
 *
 * For each bit in the mask argument:
 *
 * - if the datum is not supported:
 *
 *   - the bit will be cleared, and
 *
 *   - the datum will be set to an appropriate fabricated value if one is
 *     available (eg. CIFS can take a default uid and gid), otherwise
 *
 *   - the field will be cleared;
 *
 * - otherwise, if explicitly requested:
 *
 *   - the datum will be synchronised to the server if AT_STATX_FORCE_SYNC is
 *     set or if the datum is considered out of date, and
 *
 *   - the field will be filled in and the bit will be set;
 *
 * - otherwise, if not requested, but available in approximate form without any
 *   effort, it will be filled in anyway, and the bit will be set upon return
 *   (it might not be up to date, however, and no attempt will be made to
 *   synchronise the internal state first);
 *
 * - otherwise the field and the bit will be cleared before returning.
 *
 * Items in STATX_BASIC_STATS may be marked unavailable on return, but they
 * will have values installed for compatibility purposes so that stat() and
 * co. can be emulated in userspace.
 */
struct statx {
	/* 0x00 */
	__u32	stx_mask;	/* What results were written [uncond] */
	__u32	stx_blksize;	/* Preferred general I/O size [uncond] */
	__u64	stx_attributes;	/* Flags conveying information about the file [uncond] */
	/* 0x10 */
	__u32	stx_nlink;	/* Number of hard links */
	__u32	stx_uid;	/* User ID of owner */
	__u32	stx_gid;	/* Group ID of owner */
	__u16	stx_mode;	/* File mode */
	__u16	__spare0[1];
	/* 0x20 */
	__u64	stx_ino;	/* Inode number */
	__u64	stx_size;	/* File size */
	__u64	stx_blocks;	/* Number of 512-byte blocks allocated */
	__u64	stx_attributes_mask; /* Mask to show what's supported in stx_attributes */
	/* 0x40 */
	struct statx_timestamp	stx_atime;	/* Last access time */
	struct statx_timestamp	stx_btime;	/* File creation time */
	struct statx_timestamp	stx_ctime;	/* Last attribute change time */
	struct statx_timestamp	stx_mtime;	/* Last data modification time */
	/* 0x80 */
	__u32	stx_rdev_major;	/* Device ID of special file [if bdev/cdev] */
	__u32	stx_rdev_minor;
	__u32	stx_dev_major;	/* ID of device containing file [uncond] */
	__u32	stx_dev_minor;
	/* 0x90 */
	__u64	__spare2[14];	/* Spare space for future expansion */
	/* 0x100 */
};

/*
 * Flags to be stx_mask
 *
 * Query request/result mask for statx() and struct statx::stx_mask.
 *
 * These bits should be set in the mask argument of statx() to request
 * particular items when calling statx().
 */
#define STATX_TYPE		0x00000001U	/* Want/got stx_mode & S_IFMT */
#define STATX_MODE		0x00000002U	/* Want/got stx_mode & ~S_IFMT */
#define STATX_NLINK		0x00000004U	/* Want/got stx_nlink */
#define STATX_UID		0x00000008U	/* Want/got stx_uid */
#define STATX_GID		0x00000010U	/* Want/got stx_gid */
#define STATX_ATIME		0x00000020U	/* Want/got stx_atime */
#define STATX_MTIME		0x00000040U	/* Want/got stx_mtime */
#define STATX_CTIME		0x00000080U	/* Want/got stx_ctime */
#define STATX_INO		0x00000100U	/* Want/got stx_ino */
#define STATX_SIZE		0x00000200U	/* Want/got stx_size */
#define STATX_BLOCKS		0x00000400U	/* Want/got stx_blocks */
#define STATX_BASIC_STATS	0x000007ffU	/* The stuff in the normal stat struct */
#define STATX_BTIME		0x00000800U	/* Want/got stx_btime */
#define STATX_ALL		0x00000fffU	/* All currently supported flags */
#define STATX__RESERVED		0x80000000U	/* Reserved for future struct statx expansion */

/*
 * Attributes to be found in stx_attributes and masked in stx_attributes_mask.
 *
 * These give information about the features or the state of a file that might
 * be of use to ordinary userspace programs such as GUIs or ls rather than
 * specialised tools.
 *
 * Note that the flags marked [I] correspond to generic FS_IOC_FLAGS
 * semantically.  Where possible, the numerical value is picked to correspond
 * also.
 */
#define STATX_ATTR_COMPRESSED		0x00000004 /* [I] File is compressed by the fs */
#define STATX_ATTR_IMMUTABLE		0x00000010 /* [I] File is marked immutable */
#define STATX_ATTR_APPEND		0x00000020 /* [I] File is append-only */
#define STATX_ATTR_NODUMP		0x00000040 /* [I] File is not to be dumped */
#define STATX_ATTR_ENCRYPTED		0x00000800 /* [I] File requires key to decrypt in fs */

#define STATX_ATTR_AUTOMOUNT		0x00001000 /* Dir: Automount trigger */


#endif /* _UAPI_LINUX_STAT_H */

2.

S_ISLNK(st_mode):是否是一个连接. 
S_ISREG(st_mode) :是否是一个常规文件. 
S_ISDIR(st_mode) :是否是一个目录 
S_ISCHR(st_mode):是否是一个字符设备. 
S_ISBLK(st_mode):是否是一个块设备 
S_ISFIFO(st_mode):是否 是一个FIFO文件. 
S_ISSOCK(st_mode):是否是一个SOCKET文件 

 

C语言头文件 STAT C语言头文件 STAT C语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文件 STATC语言头文 立即下载

相关推荐

NLP自然语言处理:神经网络语言模型(NNLM)

目录 一、传统语言模型 1.1 稀疏性 1.2泛化能力差 二、神经网络语言模型 2.1 前馈神经网络模型(FFLM) 2.2 循环神经网络模型(RNNLM) 2.2.1循环神经网络模型示例 2.2.2RNN语言模型训练过程 2.2.3RNN语言模型反向传播 2.2.4语言模型评估 语言模型的构建目的是为了对语言中的各要素的分布进行估计,具有较长的研究历史和广泛...

陈宸的博客 1万+

<sys/stat.h>的含义!

stat.h头文件,轻松获取文件属性 以前还为了获取文件的长度,费劲从头读取一遍,一个一个字节的算。 做webserver时候,发现原来stat函数可以返回一个结构,里面包括文件的全部属性。 真是曲折啊。】 #i ncludestat.h> int stat(const char *restrict pathname,struct stat *restrict buf);

2万+

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 128

stat函数(重点)

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); int lstat(const char *pathname, struct stat *buf); 功能: 获取文件状态信息 stat和lstat的区别: 当文件是一个符号链接...

weixin_46098612的博客 1828

嵌入式学习(29)-ASM330LHH驱动程序

ASM330LHH是一种系统级封装器件,具有3D数字加速度计和3D数字陀螺仪,扩展温度范围上限为+105 °C,适用于汽车非安全领域的应用。ASM330LHH 的满量程加速范围为±2 g、±4 g、±8 g 和 ±16 g,角速度范围扩展至 ±125 dps、±250 dps、±500 dps、±1000 dps、± 2000 dps 和 ±4000 dps,适合各种汽车应用。

剑藏锋的博客 1175

从零开始安装 Windows 11 和 Ubuntu 22.04 双系统

本文详解Windows与Ubuntu 22.04双系统安装流程:需提前确认BIOS模式(UEFI/GPT或Legacy/MBR),关闭BitLocker加密、设备加密及快速启动;推荐Rufus/Ventoy制作启动盘。安装时需规划分区方案(建议单独划分EFI系统分区),注意引导器安装位置选择。双系统启动通过BIOS引导顺序管理,安装后需同步Windows与Linux系统时间。教程适配主流UEFI+GPT设备,强调操作前数据备份及Windows更新策略调整,避免兼容性问题。

萑澈的博客 3767

C++ 文件操作

1.定义 本章主要介绍一些和unix文件操作相关的结构体,例如stat,dirnet等 2.详解 2.1.stat简介 stat是文件类,主要作用是用来获取文件信息,其需要的头文件为#include<sys/types.h>,#include<sys/stat.h>,#include<unistd.h> 2.2.stat声明 我们使用struc...

zhang14916的博客 1407

STM32外部中断与事件机制深度解析:从硬件触发到软件响应

本文深入解析STM32外部中断与事件机制,从硬件触发到软件响应的完整流程。通过对比中断和事件的应用场景、响应速度及配置方法,帮助开发者优化嵌入式系统设计,特别适合需要低功耗或高实时性的项目。

weixin_29175469的博客 408

stat.h头文件,轻松获取文件属性(2…

lstat lstat 函数名: lstat 功  能: 获取一些文件相关的信息 用  法: int lstat(const char *path, struct stat *buf);         参数: path:文件路径名。 filedes:文件描述词。 buf:是以下结构体的指针 struct stat {       dev_t     st_dev;             i

shangyaowei的专栏 657

199、影像技术 roadmap 规划:未来移动影像的技术趋势与芯片算力展望

本文探讨了未来移动影像技术的发展趋势与芯片算力规划。作者从实际案例出发,指出影像技术演进需平衡传感器、ISP、算力和功耗。文章分为三部分:1)传感器将从堆像素转向提升信息密度,重点关注双层晶体管结构、混合快门和多光谱技术;2)ISP架构将向可编程计算单元转型,强调神经网络加速、硬件化多帧融合和语义处理;3)芯片算力瓶颈在于数据搬运,需优化存算一体架构、专用DMA和统一内存。最后给出五点建议:避免盲目追高像素、重视持续功耗、平衡ISP灵活性、预留算力余量、加强传感器与ISP协同设计。作者强调,影像技术的突破在

sundong_81的博客 59

vue - 网站接入微信扫码登录功能详细教程,完整详细流程及完整功能示例源代码(附常见问题的解决方案与二维码样式修改方案)

vue.js项目植入微信登录,vue网页项目怎么做微信扫码登录,VUE项目中的微信扫码登录,VUE中最简单的js调用微信扫一扫功能,vue:如何设计网页的微信扫码登录功能,微信扫码功能官方文档,通过vue方式实现二维码扫码功能,vue调用微信扫码,vue H5 调用微信扫描二维码,Vue前端实现微信扫码登录,vue-wxlogin 微信授权登录组件,网站引入的微信登录框如何修改宽高或其他样式,wxlogin 组件插件怎么改变宽高,vue-wxlogin组件怎么自定义样式,微信网页授权,vue调用微信JSDK

✅ 精选推荐文章 6365

Linux系统下sys/stat.h中的stat/fstat/l_stat——C语言

stat/fstat/l_stat #include <sys/stat.h> 功能:用来获取文件属性,返回值:成功返回0,失败返回-1 int stat(const char *path, struct stat *buf); path:需要文件路径 int fstat(int fd, struct *buf); fd:需要打开后的文件描述符 int lstat(con...

Love丶伊卡洛斯 6776

第一百三十九回 介绍三个BLE包

本章回中主要介绍了Flutter中BLE的概念和操作方法,主要介绍了三个BLE包的功能和差异,以方便大家在BLE操作中选择不同的包。

talk_8的专栏 574

H2O-3 分布式随机森林(DRF)完全指南:从算法原理到实战调参

> 本文以 H2O-3 开源仓库中 [DRF 官方文档](https://link.gitcode.com/i/68e5573af857b3d19002851022ee170d) 为骨架,结合 `h2o-algos` 模块的 Java 源码、Python/R 客户端实现与测试用例,系统讲解 Distributed Random Forest(DRF)的分类/回归原理、极端随机树(XRT)、全部可调

gitblog_00021的博客 264

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

哈工大操作系统实验9 proc文件系统的实现

该篇文章是哈工大操作系统实验9——proc文件系统的实现完成笔记,文件系统有点难理解,一开始我一直没有搞太明白file、inode、block等之间的关系,后来结合源码、注释书籍、实验内容终于弄清晰了。

晴空闲云 1175

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入解析Linux stat系统调用:从ls -l到文件元数据获取

在Linux系统编程中,文件元数据管理是理解操作系统底层机制的核心概念之一。元数据包含了文件类型、权限、所有者、大小和时间戳等关键信息,这些信息通过inode数据结构存储在文件系统中。系统调用stat作为获取这些元数据的总开关,能够将inode中的信息提取到struct stat结构体中,为上层应用提供统一的数据接口。这一机制不仅支撑了ls -l等基础命令的功能实现,更是文件权限管理、备份同步、性能监控等场景的技术基石。通过解析st_mode字段的位运算,开发者可以精确判断文件类型和权限位,包括SUID、S

weixin_30740295的博客 313

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ESP8266 Arduino 内核中的 SPIFFS:面向 SPI NOR Flash 的轻量文件系统完整指南

SPIFFS(SPI Flash File System,V0.3.7)是专为嵌入式 SPI NOR Flash 设计的文件系统,本仓库以源码形式内置于 Arduino ESP8266 core 的 [cores/esp8266/spiffs](https://link.gitcode.com/i/538c479814d678a8baebb6140d6a5a48) 目录,并通过 [spiffs_a

gitblog_01180的博客 964

如何用VMPrint搭建多栏版式:story、strip与zone-map选型指南

VMPrint 是一款面向自动化文档生产的确定性排版引擎。用 VMPrint 搭建多栏版式时,关键是选对空间容器:**story、strip、zone-map** 各自解决不同的排版问题。这份选型指南用 30 秒帮你判断该用哪一个,并避开新手最常踩的 3 个坑。 [![VMPrint多栏版式排版引擎概览:出版级PDF生成与浏览器实时预览](https://raw.gitcode.com/gh_m

gitblog_00792的博客 478

linux0.11多任务管理程序阅读注释笔记

[1] 粗略阅读linux0.11引导程序。 [2] 粗略阅读linux0.11由实模式进入保护模式的程序 。 [3] 粗略阅读linux0.11护模式初始化程序。 [4] 粗略阅读linux0.11主存管理程序。 [5] 粗略阅读linux0.11中断/异常机制初始设置相关程序。 [6] 粗略阅读linux0.11缓冲区管理程序。 [7] 粗略阅读linux0.11文件系统管理程序。 [8] 粗...

记一忘三二 6947

Linux 内核源代码的目录结构

由于Linux 内核是一种单内核模式的系统,因此,内核中所有的程序几乎都有紧密的联系,它们之间的依赖和调用关系非常密切。所以在阅读一个源代码文件时往往需要参阅其它相关的文件。因此有必要在开始阅读内核源代码之前,先熟悉一下源代码文件的目录结构和安排。这里我们首先列出Linux 内核完整的源代码目录,包括其中的子目录。然后逐一介绍各个目录中所包含程序的主要功能,使得整个内核源代码的安排形式能在我们的头

Mr. David 专栏 5395

MicroPython MEMZIP 只读文件系统全解析:原理、构建流程与源码实现

MEMZIP 是 MicroPython 提供的一种极简只读文件系统方案:它把一个由**未压缩文件**组成的 ZIP 归档整体嵌入固件,在运行时将其当作文件系统使用,从而让 Python 模块可以直接被 `import`。本文以 [shared/memzip/README.md](https://link.gitcode.com/i/f244782152a97f3adff2dd3a1d85b685

gitblog_01143的博客 764

从零实现Linux ls命令:深入理解文件系统与系统调用

在Linux系统编程中,文件系统操作是核心基础。理解文件与目录的底层原理,掌握系统调用与内核交互机制,是开发高效命令行工具的关键。通过实现ls命令,可以深入实践文件元数据获取、目录遍历、权限解析等核心技术,其技术价值在于打通用户空间与内核空间的交互逻辑,为开发更复杂的系统工具奠定基础。这一过程涉及opendir、readdir、stat等关键系统调用,以及数据结构解析、内存管理等工程实践,是学习操作系统和C语言系统编程的经典应用场景。本文以ls命令实现为例,详细剖析了Linux文件系统操作与系统调用的具体应

weixin_30247307的博客 398

Linux命令背后的系统逻辑:从终端操作到内核机制

Linux命令不是孤立的工具,而是操作系统资源管理的接口层。理解其底层原理,需从进程调度、内存管理、文件系统和网络协议栈四大核心出发——例如ps反映/proc虚拟文件系统与task_struct状态,ss替代netstat源于对内核socket哈希表的直接访问优化,iostat与vmstat的差异本质是块设备驱动层与虚拟内存子系统的观测维度之分。掌握这些命令的内核映射关系,能显著提升故障定位效率、规避权限与管道陷阱,并支撑容器、云原生等现代基础设施的深度运维。本文聚焦20个高价值命令,揭示其在真实系统诊断链

weixin_30599769的博客 455

定制PostgreSQL内核=内核源码级定制——改PostgreSQL内核本身

【代码】定制PostgreSQL内核=内核源码级定制——改PostgreSQL内核本身+信创发行版——打包你自己的PostgreSQL。

qq_37805832的博客 27

TEN Framework 内置 libuv 的 FS Poll 句柄(uv_fs_poll_t)详解:基于 stat 轮询的文件变更监控机制

FS Poll(文件系统轮询)句柄是 libuv 提供的一种**不依赖操作系统文件系统事件通知(fs event)**、而是通过周期性执行 `stat` 系统调用比对文件元数据来检测变更的监控手段。本文以仓库中 vendored 的 libuv 文档 [third_party/libuv/docs/src/fs_poll.rst](https://link.gitcode.com/i/d7f833

gitblog_00437的博客 234

Linux内核架构解析与开发实践:从核心原理到模块编程

操作系统内核作为计算机系统的核心组件,负责管理硬件资源并为应用程序提供执行环境。其核心原理包括进程调度、内存管理、文件系统等子系统协同工作,通过系统调用实现用户态与内核态的交互。在工程实践中,内核模块编程技术允许开发者动态扩展内核功能,而无需重新编译整个内核,这为驱动开发和系统定制提供了灵活且安全的途径。通过虚拟文件系统如/proc和sysfs,可以实时监控和调整内核状态,而eBPF等动态追踪工具则极大提升了内核调试与性能分析的效率。理解Linux内核架构与开发流程,对于从事系统编程、性能优化及底层软件开发

weixin_34126557的博客 411
上一篇: 【VSCode】提升效率
下一篇: 【linux内核分析与应用-陈莉君】设备驱动概述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值