热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux获取文件属性stat()、fstat()、lstat()函数实例学习

Linux获取文件属性stat()、fstat()、lstat()函数实例学习一、我们经常用ls命令查看到的文件信息,其实都可以使用stat函数组提取出来。二、sta
Linux获取文件属性stat()、fstat()、lstat()函数实例学习




一、我们经常用ls命令查看到的文件信息,其实都可以使用stat函数组提取出来。




二、stat函数组

           1、函数int stat(const char *path, struct stat *buf);
            – 参数*path:文件路径
            – 参数*buf:文件信息
            – 返回值:成功为0,否则为-1


           2、函数int fstat(int fd, struct stat *buf);
            – 参数fd:文件描述符
            – 参数*buf:文件信息
            – 返回值:成功为0,否则为-1
           3、函数int lstat(const char *path, struct stat *buf);
            – 参数*path:文件路径
            – 参数*buf:返回文件的信息,针对符号链接,lstat 返回链接本身,而不是而非目标文件
            – 返回值:成功为0,否则为-1


           4、执行失败时候,error被自动设置为下面的值:

              EBADF: 文件描述词无效

              EFAULT: 地址空间不可访问

              ELOOP: 遍历路径时遇到太多的符号连接

              ENAMETOOLONG:文件路径名太长

              ENOENT:路径名的部分组件不存在,或路径名是空字串

              ENOMEM:内存不足

              ENOTDIR:路径名的部分组件不是目录




            5、特别说明:

            (1) stat() 和 lstat() 都是通过文件路径和文件名访问到文件,然后把文件属性放到 struct stat                   *buf中;而 fstat() 是通过文件描述符得到文件的属性。

            (2) 文件本身没有什么权限限制,但是文件的上层目录必须有访问权限才能获取到文件的属性。

            (3) 当文件是符号链接时,lstat() 返回的是该符号链接本身的信息;而 stat() 返回的是该该符号链                 接指向的文件的信息。




三、查看一下stat结构体(man 2 stat)










stat结构体中的st_mode 则定义了下列数种情况:
    S_IFMT   0170000    文件类型的位遮罩
    S_IFSOCK 0140000    scoket
    S_IFLNK 0120000     符号连接
    S_IFREG 0100000     一般文件
    S_IFBLK 0060000     区块装置
    S_IFDIR 0040000     目录
    S_IFCHR 0020000     字符装置
    S_IFIFO 0010000     先进先出

    S_ISUID 04000     文件的(set user-id on execution)位
    S_ISGID 02000     文件的(set group-id on execution)位
    S_ISVTX 01000     文件的sticky位

    S_IRUSR(S_IREAD) 00400     文件所有者具可读取权限
    S_IWUSR(S_IWRITE)00200     文件所有者具可写入权限
    S_IXUSR(S_IEXEC) 00100     文件所有者具可执行权限

    S_IRGRP 00040             用户组具可读取权限
    S_IWGRP 00020             用户组具可写入权限
    S_IXGRP 00010             用户组具可执行权限

    S_IROTH 00004             其他用户具可读取权限
    S_IWOTH 00002             其他用户具可写入权限
    S_IXOTH 00001             其他用户具可执行权限

    上述的文件类型在POSIX中定义了检查这些类型的宏定义:
    S_ISLNK (st_mode)    判断是否为符号连接
    S_ISREG (st_mode)    是否为一般文件
    S_ISDIR (st_mode)    是否为目录
    S_ISCHR (st_mode)    是否为字符装置文件
    S_ISBLK (s3e)        是否为先进先出
    S_ISSOCK (st_mode)   是否为socket









四、实例获取文件信息测试代码:

/* file stat example */ #include
#include
#include
#include #include
#include int main(int argc, char **argv){ struct stat st; if(argc != 2){ fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if(stat(argv[1], &st) == -1){ perror("stat"); exit(EXIT_SUCCESS); } printf("File type: "); switch(st.st_mode & S_IFMT){ case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("character device\n"); break; case S_IFDIR: printf("directory\n"); break; case S_IFIFO: printf("FIFO/pipe\n"); break; case S_IFLNK: printf("symlink\n"); break; case S_IFREG: printf("regular file\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("unknown?\n"); break; } printf("I-node number: %ld\n", (long) st.st_ino); printf("Mode: %lo (octal)\n", (unsigned long) st.st_mode); printf("Link count: %ld\n", (long) st.st_nlink); printf("Ownership: UID=%ld GID=%ld\n", (long) st.st_uid, (long) st.st_gid); printf("device containing file id:%ld \n", (long) st.st_dev); printf("device id: %ld \n", (long) st.st_rdev); printf("File size: %lld bytes\n", (long long) st.st_size); printf("Preferred I/O block size: %ld bytes\n", (long) st.st_blksize); printf("Blocks allocated: %lld\n", (long long) st.st_blocks); printf("Last status change: %s", ctime(&st.st_ctime)); printf("Last file access: %s", ctime(&st.st_atime)); printf("Last file modification: %s", ctime(&st.st_mtime)); exit(EXIT_SUCCESS);
}

五、运行测试效果











推荐阅读
  • socket8 [命名管道]
    ::命名管道不但能实现同一台机器上两个进程通信,还能在网络中不同机器上的两个进程之间的通信机制。与邮槽不同,命名管道是采用基于连接并且可靠的传输方式,所以命名管道传输数据只能一对一 ... [详细]
  • 接上文http:blog.itpub.net29254281viewspace-1318239领导让开发同学鼓捣一个可配置化的后台.又回到了原来的问题如果要灵活,很多参数要 ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • 题目描述输入整型数组和排序标识,对其元素按照升序或降序进行排序(一组测试用例可能会有多组数据)本题有多组输入,请使用whil ... [详细]
  •  很好的博客:https:blog.csdn.netqq_39809664articledetails79934516可持久化数组#include#inclu ... [详细]
  • 最近想用js做一个简单的计算器,不过网上的例子好像大部分都是直接从左到右挨个计算,就好像1+2*5,就会先计算1+2,再计算3*5,并没有实现运算符的优先级,这里找到了一种方法实现,来总结一下。不过这 ... [详细]
  • 题意给出一个长度为n的序列,有一些位置可以放任意的数,问最长上升序列的长度。n ... [详细]
  • [ipsec][strongswan]strongswan源码分析(五)plugin的配置文件的添加方法与管理架构解析
    我们知道,strongswan是基于插件式管理的。不同的插件有不同的配置文件,在这下面,我们以netlink的插件为例:etcstrongswan.dcharonkernel-ne ... [详细]
  • c语言自定义BOOL函数C语言没有BOOL类型变量boolean类型是C++所独有的由于使用BOOL类型可以使代码更具有可读性,很多编程者都在C中自己定义了类似的应用,一般方法有两 ... [详细]
  • IPVlan 详解
    文章目录简介Ipvlan2同节点Ns互通Ns内与宿主机通信第三种方法Ns到节点外部结论Ipvlan31.同节点Ns互通Ns内与宿主机通信Ns内到外部网络总结源码分析ipvlan收包 ... [详细]
  • 题目概述:我们应该知道,int是32位的(9位十进制左右),longlong是64位的(19位十进制左右)&# ... [详细]
  • 最近自己做一个工具最后涉及到一个存储成bmp位图的形式,由于这部分并不是整个project的重点我就从网上找了例子改了改,但是目前的问题是有很多时候都是存储的bmp全黑,我也并不知道是怎么回事。 ... [详细]
  • 贴图的支持及设置:关于贴图分辨率的支持及设置的用户指南
    http:hi.baidu.comdbfr2011818itemeef1eac8df31a2d69744520b贴图分辨率虚幻引擎3支持的贴图分辨率是从1x1到4096x4096 ... [详细]
  • iic协议
    IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S ... [详细]
  • 下面是一个用openssl实现获取https网页内容的demo,整个流程比较简单,主要封装的API如下staticinthttps_init(http ... [详细]
author-avatar
睡姿决定发型
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有