Linux stat函数_c++ stringbuffer

Linux stat函数_c++ stringbuffer之前写过一篇关于stat命令的博客,介绍了stat命令的使用和输出信息表示,今天又见到了stat函数,因为输出原因,准备整理一下。stat函数介绍  根据《UNIX环境高级编程》中对于stat函数的解释,stat函数和stat命令一样,都是返回该文件的详细信息。函数定义为:#include<sys/types.h>#include&lt…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  • 之前写过一篇关于stat命令的博客,介绍了stat命令的使用和输出信息表示,今天又见到了stat函数,因为输出原因,准备整理一下。
stat函数介绍

  根据《UNIX环境高级编程》中对于stat函数的解释,stat函数和stat命令一样,都是返回该文件的详细信息。
函数定义为:

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    int stat(const char *pathname, struct stat *buf);

  其中pathname是文件的路径名,支持绝对路径和相对路径,buf是一个结构体保存文件的信息,这个结构体的构造如下:

 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 */
               uid_t     st_uid;         /* user ID of owner */
               gid_t     st_gid;         /* group ID of owner */
               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 */
               blkcnt_t  st_blocks;      /* number of 512B blocks allocated */

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               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
           };
数据类型 变量名 实际数据类型 输出方式 表示含义
mode_t st_mode unsigned int %u 文件类型和权限
dev_t st_dev long long int %lu 文件的主、次设备信息
dev_t st_rdev long long int %lu 如果是字符设备和块设备会有这个字段
ino_t st_ino unsigned long int %lu inode编号
nlink_t st_nlink unsigned long int %lu 硬链接的个数
uid_t st_uid unsigned int %u uid编号
git_t st_gid unsigned int %u gid编号
blksize_t st_blksize long int %ld 占用区块的大小,一般和页表大小相同
blkcnt_t st_blocks long int %ld 占用几个页表或区块
off_t st_size long int %ld 文件的大小

  另外,注意结构体中的三个宏定义,本来st_mtime,st_atime,st_ctime三个都是一个timespac的结构体,但是经过宏定义后,直接可以输出,这个如果不细心的话还是很容易搞乱的。

  与之对应的还有几个宏定义,需要了解一下,对于stat结构体中的st_mode,有几个宏定义一颗根据st_mode的值判断打开文件的类型:

函数 参数 使用 返回值类型 含义
S_ISREG() st_mode S_ISR EG(st_mode) bool 是否为普通文件
S_ISDIR() st_mode S_ISDIR(st_mode) bool 是否为目录
S_ISCHR() st_mode S_ISCHR(st_mode) bool 是否为字符特殊文件
S_ISBLK() st_mode S_ISBLK(st_mode) bool 是否为块文件
S_ISFIFO() st_mode S_ISFIFO(st_mode) bool 是否为管道
S_ISLINK() st_mode S_ISLINK(st_mode) bool 是否为符号链接
S_ISSOCK() st_mode S_ISSOCK(st_mode) bool 是否为套接字
S_TYPEISMQ() &st_mode S_TYPEISMQ(st_mode) bool 是否为消息队列
S_TYPEISSEM() &st_mode S_TYPEISSEM(st_mode) bool 是否为信号量
S_TYPEISSHM() &st_mode S_TYPEISSHM(st_mode) bool 是否为共享内存
  • 数据类型可以在/usr/include/x86_64-linux-gnu/sys/types.h中找到,发现又是

不想看这些条条串串的,可以直接看最后的表格

#ifndef __mode_t defined
typedef __mode_t mode_t;
#define __mode_t_defined
#endif
  • 根据头文件bits/types.h(/usr/inlcude/x86_64-linux-gnu/bits/types.h)查询,此时找到的是:
# define __STD_TYPE typedef

__STD_TYPE __DEV_T_TYPE __dev_t;            /* Type of device numbers. */
__STD_TYPE __UID_T_TYPE __uid_t;            /* Type of user identifications. */
__STD_TYPE __GID_T_TYPE __gid_t;            /* Type of group identifications. */
__STD_TYPE __INO_T_TYPE __ino_t;            /* Type of file serial numbers. */
__STD_TYPE __MODE_T_TYPE __mode_t;          /* Type of file attribute bitmasks. */
__STD_TYPE __NLINK_T_TYPE __nlink_t;        /* Type of file link counts. */
__STD_TYPE __OFF_T_TYPE __off_t;            /* Type of file sizes and offsets. */

//还有很多,自己看吧。
  • typesizes.h中是这么定义的
#define __DEV_T_TYPE __UQUAD_TYPE
#define __UID_T_TYPE __U32_TYPE
#define __GID_T_TYPE __U32_TYPE
#define __INO_T_TYPE __SYSCALL_ULONG_TYPE
#define __MODE_T_TYPE __U32_TYPE
#ifdef __x86_64__
# define __NLINK_T_TYPE __SYSCALL_ULONG_TYPE
# define __FSWORD_T_TYPE __SYSCALL_SLONG_TYPE
#else
# define __NLINK_T_TYPE __UWORD_TYPE
# define __FSWORD_T_TYPE __SWORD_TYPE
#endif
#define __OFF_T_TYPE __SYSCALL_SLONG_TYPE
  • 绕了一圈又回去了。。。伤脑筋。
    然后对照信息,终于发现定义,基本是这样:
目标数据类型 文件sys/types.h 文件/bits/types.h 文件typesizes.h 文件sys/types.h
mode_t __mode_t __MODE_T_TYPE __U32_TYPE unsigned int
dev_t __dev_t __DEV_T_TYPE __UQUAD_TYPE __u_quad_t –> long long int
ino_t __ino_t __INO_T_TYPE __SYSCALL_ULONG_TYPE unsigned long int
nlink_t __nlink_t __NLINK_T_TYPE __SYSCALL_ULONG_TYPE unsigned long int
uid_t __uid_t __UID_T_TYPE __U32_TYPE unsigned int
git_t __git_t __GID_T_TYPE __U32_TYPE unsigned int
blksize_t __blksize_t __BLKSIZE_T_TYPE __SYSCALL_SLONG_TYPE long int
blkcnt_t __blkcnt_t __BLKCNT_T_TYPE __SYSCALL_SLONG_TYPE long int
* 所以查找东西真的很累,有没有人给我推荐一个软件或一种方法*
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/171792.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月21日 上午9:46
下一篇 2022年8月21日 上午10:00


相关推荐

  • IDEA 如何快速创建 Springboot 项目[通俗易懂]

    IDEA 如何快速创建 Springboot 项目[通俗易懂](1)打开IDEA,左上角选择:File->New->Project(2)首选选择弹窗左侧的SpringInitializr,然后选好择你的JDK,点击Next。(3)填写并选择:1,2处:是Maven工程的两个属性唯一标识,随意填。3处:类型选择Maven项目4处:语言选择Java5处:打包方式选择Jar6处:Java版本选择81-6处确定好后,选择Next。(4)左侧选择Web后,勾选SpringWe…

    2022年10月11日
    5
  • java高并发详解

    java高并发详解转载地址:https://www.cnblogs.com/lr393993507/p/5909804.html&nbsp;&nbsp;对于开发的网站,如果网站的访问量非常大,那么我们应该考虑相关的、并发访问问题,并发是绝大部分程序员头疼的问题;为了更好的理解并发和同步,先明白两个重要的概念:异步和同步;&nbsp;1、同步和异…

    2022年5月19日
    33
  • vue 父传子 子传父实现方式

    vue 父传子 子传父实现方式父传子 主要步骤 首先在子组件 props 中创建一个属性 用以接收父组件传过来的值 然后父组件中引用子组件 并在子组件标签中添加子组件 props 中创建的属性 最后把需要传给子组件的值赋给该属性 理解 父亲传给儿子东西 儿子在那边用一个碗接 这个碗就是 props 因为传的东西不可能只是一个 所以是一个数组 父亲因为要传东西到儿子的碗里 所以要绑定儿子的碗 然后传值 props properties 的简称 prop 只可以从上一级组件传递到下一级组件 父子组件

    2026年3月18日
    1
  • 便携AI聚合API ChatGPT 4o生图功能使用教程

    便携AI聚合API ChatGPT 4o生图功能使用教程

    2026年3月16日
    3
  • 2016年四川省TI杯电子设计竞赛B题

    2016年四川省TI杯电子设计竞赛B题B题:自动循迹小车1.任务设计制作一个自动循迹小车。小车采用一片TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。图1跑道示意图2.要求(1)在图1小车所在的直线区任意指定一

    2022年6月7日
    34
  • 百度Ai搜索如何识别用户意图_百度Ai搜索识意图窍门【教程】

    百度Ai搜索如何识别用户意图_百度Ai搜索识意图窍门【教程】

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号