Linux系统编程 49 -stat函数

学习笔记

stat函数
获取文件属性,说白了就是从inode中获取

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

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

第一参数:文件路径 传入参数
第二参数:struct stat *statbuf:传出参数,存储文件属性信息

返回值:
成功是0
失败是-1  


重点是结构体

几乎就是ls -l出来的信息

struct stat {
    dev_t     st_dev;         /* ID of device containing file *///使用的设备
    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
    dev_t     st_rdev;        /* Device ID (if special file) */
    off_t     st_size;        /* Total size, in bytes *///大小
    blksize_t st_blksize;     /* Block size 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
};


获取文件大小的正规操作:st_size成员
查看下面的程序:

$cat mystat.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    struct stat sbuf;
    int ret = stat(argv[1],&sbuf);
    if( -1 == ret )
    {
        perror("stat error");
        exit(1);
    }

    printf("file size:%ld\n",sbuf.st_size);
    return 0;
}
$ls
f.c  makefile  mystat  mystat.c
$./mystat ./f.c
file size:500
$ls -l f.c
-rwxr--r-- 1 ubuntu ubuntu 500 12月 24 00:00 f.c

作业:
st_mode 就是文件类型,使用这个成员来可以判断文件类型

           if ((sb.st_mode & S_IFMT) == S_IFREG) {
               /* Handle regular file */
           }
 

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

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

S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值