Linux 环境编程之文件目录:函数stat、fstat、fstatat、lstat

几个函数返回文件相关的信息结构

#include<sys/stat.h>
int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat (const char *pathname, struct stat *buf);
int fstatat(int fd, const char *pathname,struct stat *buf, int flag);

参数:

  • pathname:文件路径
  • fd:已打开文件描述符
  • buf:返回文件信息
  • flag:标识是否跟随符号链接,AT_SYMLINK_NOFOLLOW 标志设置时,不跟随符号链接,返回链接本身信息。

返回:成功返回0,错误返回-1

  • stat:返回文件信息结构
  • fstat:返回fd引用的文件信息
  • lstat:类似stat,但对于符号链接,lstat返回符号链接信息,stat返回链接引用的文件信息
  • fstatat:根据flag的取值,等价于stat或lstat。

文件信息结构体:

struct stat {
    mode_t             st_mode;    /* protection */
    ino_t              st_ino;     /* inode节点号 */
    dev_t              st_dev;     /* 文件所在设备的ID */
    dev_t              st_rdev;    /* device ID (if special file) */
    nlink_t            st_nlink;   /* 指向此文件的硬链接数 */
    uid_t              st_uid;     /* user ID of owner */
    gid_t              st_gid;     /* group ID of owner */
    off_t              st_size;    /* 文件大小(字节) */
    struct timespec    st_atime;   /* 最近存取时间(access) */
    struct timespec    st_mtime;   /* 最近修改时间(modification) */
    struct timespec    st_ctime;   /* 最近状态变更时间status change */
    blksize_t          st_blksize; /* 文件系统IO块大小 */
    blkcnt_t           st_blocks;  /* 文件所占块数(512B/块) */
};

struct timespec {
    time_t tv_sec; 
    long   tv_nsec;
	……
};

测试代码:

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
    int fd = open("stattest.txt", O_RDWR | O_CREAT, 0600);
	if (fd < 0)
	{
		printf("open error.\n");
		return -1;
	}

	int ret = symlink("./stattest.txt", "./statlink");
	if (ret != 0)
	{
		printf("create link error.\n");
		return -1;
	}

	struct stat buf;
	ret = stat("./statlink", &buf);
	if (ret == -1)
	{
		printf("stat error\n");
		return -1;
	}

	printf("origin file stat:\n");
	printf("mode:%d\n", buf.st_mode);
    printf("inode:%d\n", buf.st_ino);    
    printf("dev:%d\n", buf.st_dev);    
    printf("rdev:%d\n", buf.st_rdev);   
    printf("link:%d\n", buf.st_nlink);  
    printf("uid:%d\n", buf.st_uid);    
    printf("gid:%d\n", buf.st_gid);    
    printf("size:%d\n", buf.st_size);   
    printf("atime:%d\n", buf.st_atime);  
    printf("mtime:%d\n", buf.st_mtime);  
    printf("ctime:%d\n", buf.st_ctime);  
    printf("blocksize:%d\n", buf.st_blksize);
    printf("blocks:%d\n", buf.st_blocks); 

	struct stat linkbuf;
	ret = lstat("./statlink", &linkbuf);
	if (ret == -1)
	{
		printf("stat error\n");
		return -1;
	}

	printf("link file stat:\n");
	printf("mode:%d\n", linkbuf.st_mode);
    printf("inode:%d\n", linkbuf.st_ino);    
    printf("dev:%d\n", linkbuf.st_dev);    
    printf("rdev:%d\n", linkbuf.st_rdev);   
    printf("link:%d\n", linkbuf.st_nlink);  
    printf("uid:%d\n", linkbuf.st_uid);    
    printf("gid:%d\n", linkbuf.st_gid);    
    printf("size:%d\n", linkbuf.st_size);   
    printf("atime:%d\n", linkbuf.st_atime);  
    printf("mtime:%d\n", linkbuf.st_mtime);  
    printf("ctime:%d\n", linkbuf.st_ctime);  
    printf("blocksize:%d\n", linkbuf.st_blksize);
    printf("blocks:%d\n", linkbuf.st_blocks); 
}

输出:

origin file stat:
mode:33152
inode:284119
dev:2056
rdev:0
link:1
uid:1000
gid:1000
size:4
atime:1547166324
mtime:1547166342
ctime:1547166342
blocksize:4096
blocks:8
link file stat:
mode:41471
inode:284120
dev:2056
rdev:0
link:1
uid:1000
gid:1000
size:14
atime:1547167053
mtime:1547167053
ctime:1547167053
blocksize:4096
blocks:0

可以通过 ll -i 命令还有其他方式验证以上信息。

stat 函数在 ls -l 命令中使用

参考:

Linux C API 参考手册

LinuxAPI

《Unix环境高级编程》4.2 小节

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值