fstat
是一个在 Unix 和 Linux 系统中常用的系统调用,用于获取打开文件的文件状态信息。它可以将文件的状态信息(例如文件类型,权限,所有者,大小等)填充到一个 struct stat
结构体中。
以下是 fstat
函数的原型:
#include <sys/stat.h>
#include <unistd.h>
int fstat(int fd, struct stat *buf);
其中,fd
是需要查询状态的文件的文件描述符,buf
是一个指向 struct stat
的指针,函数将把查询到的文件状态信息填充到这个结构体中。如果调用成功,函数返回 0,否则返回 -1 并设置 errno
以指示错误。
struct stat
结构体的定义如下:
struct stat {
dev_t st_dev; // 设备ID
ino_t st_ino; // inode节点号
mode_t st_mode; // 文件类型和权限
nlink_t st_nlink; // 硬链接数
uid_t st_uid; // 所有者ID
gid_t st_gid; // 组ID
dev_t st_rdev; // 设备类型(如果为inode设备)
off_t st_size; // 文件大小(字节数)
blksize_t st_blksize; // 文件系统I/O块大小
blkcnt_t st_blocks; // 分配块数
time_t st_atime; // 最后访问时间
time_t st_mtime; // 最后修改时间
time_t st_ctime; // 最后状态改变时间
};
以下是一个简单的 fstat
使用示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
int main(void)
{
struct stat st;
if (-1 == stat("test.txt", &st))
{ /*获得文件的状态,将状态值放入st中*/
printf("获得文件状态失败\n");
return -1;
}
printf("包含此文件的设备ID:%d\n", (int)st.st_dev); /*文件的ID号*/
printf("此文件的节点:%d\n", (int)st.st_ino); /*文件的节点*/
printf("此文件的保护模式:%d\n", (int)st.st_mode); /*文件的模式*/
printf("此文件的硬链接数:%d\n", (int)st.st_nlink); /*文件的硬链接数*/
printf("此文件的所有者ID:%d\n", (int)st.st_uid); /*文件的所有者ID*/
printf("此文件的所有者的组ID:%d\n", (int)st.st_gid); /*文件的组ID*/
printf("设备ID(如果此文件为特殊设备):%d\n", (int)st.st_rdev); /*文件的设备ID*/
printf("此文件的大小:%d\n", (int)st.st_size); /*文件的大小*/
printf("此文件的所在文件系统块大小:%d\n", (int)st.st_blksize); /*文件的系统块大小*/
printf("此文件的占用块数量:%d\n", (int)st.st_blocks); /*文件的块大小*/
printf("此文件的最后访问时间:%d\n", (int)st.st_atime); /*文件的最后访问时间*/
printf("此文件的最后修改时间:%d\n", (int)st.st_mtime); /*文件的最后修改时间*/
printf("此文件的最后状态改变时间:%d\n", (int)st.st_ctime); /*文件的最后状态改变时间*/
return 0;
}
在这个示例中,我们首先使用 open
函数打开名为 “test.txt” 的文件,然后使用 fstat
函数获取该文件的状态信息,并将文件大小打印到控制台。最后,我们使用 close
函数关闭文件。注意,我们在 printf
中使用 %lld
来打印 off_t
类型的 st_size
,这是因为 off_t
类型可能是一个更大的整数类型,而 %ld
可能无法正确地打印它。
编译及执行结果如下:
(venv311) ➜ c git:(liucc) ✗ gcc -o myfstat fstat-01.c
(venv311) ➜ c git:(liucc) ✗ ./myfstat
包含此文件的设备ID:16777223
此文件的节点:101403657
此文件的保护模式:33188
此文件的硬链接数:1
此文件的所有者ID:501
此文件的所有者的组ID:20
设备ID(如果此文件为特殊设备):0
此文件的大小:0
此文件的所在文件系统块大小:4096
此文件的占用块数量:0
此文件的最后访问时间:1718071271
此文件的最后修改时间:1718071271
此文件的最后状态改变时间:1718071271
注意:使用 fstat
或其他系统调用时,请确保包含正确的头文件,并在编译时链接必要的库(通常是 libc)。同时,处理系统调用返回的错误时,最好检查 errno
以获取更详细的错误信息。