几个函数返回文件相关的信息结构
#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 命令中使用
参考:
《Unix环境高级编程》4.2 小节