struct stat
是一个用于描述文件和目录状态的结构体。它通常用于stat()
、lstat()
和fstat()
等函数的参数中,以便函数可以获取文件或目录的状态信息。
以下是struct stat
结构体的定义:
#include
struct stat {
dev_t st_dev; /* 设备编号 */
ino_t st_ino; /* 文件编号 */
mode_t st_mode; /* 文件模式 */
nlink_t st_nlink /* 硬链接数 */
uid_t st_uid; /* 所有者用户ID */
gid_t st_gid; /* 所有者组ID */
struct timespec st_atime; /* 最近一次访问时间 */
struct timespec st_mtime; /* 最近一次修改时间 */
struct timespec st_ctime; /* 创建时间 */
off_t st_size; /* 文件大小 */
blk_t st_blksize; /* 块大小 */
blk_cnt_t st_blocks; /* 块数量 */
float st_btime; /* 平均磁盘使用时间 */
};
其中,各个成员的含义如下:
st_dev
:设备的编号,用于唯一标识一个设备。
st_ino
:文件的编号,用于唯一标识一个文件。
st_mode
:文件模式用于描述文件的访问权限、所有者、组和其他属性。
st_nlink
:硬链接数,用于描述文件有多少个硬链接。
st_uid
:所有者用户ID,用于描述文件所有者的身份。
st_gid
:所有者组ID,用于描述文件所有者的组身份。
st_atime
:最近一次访问时间,用于描述文件最近一次被访问的时间。
st_mtime
:最近一次修改时间,用于描述文件最近一次被修改的时间。
st_ctime
:创建时间,用于描述文件被创建的时间。
st_size
:文件大小,用于描述文件的大小。
st_blksize
:块大小,用于描述文件的块大小。
st_blocks
:块数量,用于描述文件包含的块数量。
st_btime
:平均磁盘使用时间,用于描述磁盘使用情况的平均值。
在stat()
、lstat()
和fstat()
函数中,可以使用struct stat
结构体来获取文件或目录的状态信息。这些信息可以用于确定文件的访问权限、所有者、组和其他属性,以及文件的大小、创建时间等信息。
stat
函数是一个系统调用,用于获取指定文件的元数据文件的状态信息),如文件大小、访问权限、最近访问时间等。
#include#include #include int stat(const char *pathname, struct stat *statbuf);
pathname
:要查询的文件路径。
statbuf
:指向struct stat
类型的指针,用于保存获取到的文件元数据信息。
stat
函数返回0表示成功获取文件元数据。如果获取失败,返回-1,并设置errno
错误码。
下面是一个使用stat
函数获取文件元数据的示例:
#include
#include
#include
#include
int main() {
const char *pathname = "example.txt";
struct stat file_stat;
int ret = stat(pathname, &file_stat);
if (ret == -1) {
perror("stat");
return 1;
}
printf("File Size: %lld bytes\n", file_stat.st_size);
printf("Mode: %lo (octal)\n", (unsigned long)file_stat.st_mode);
printf("Owner UID: %d\n", file_stat.st_uid);
printf("Last Access Time: %s", ctime(&file_stat.st_atime));
return 0;
}
在这个示例中,我们使用stat
函数获取文件example.txt
的元数据,并将结果保存在struct stat
类型的file_stat
结构体中。
然后,我们打印了获取到的文件大小、文件访问权限、所有者的用户ID以及最近访问时间。
lstat()
函数与stat()
函数类似,也用于获取文件的元数据(文件状态信息),但是可以识别符号链接并获取符号链接文件本身的信息。
#include#include #include int lstat(const char *pathname, struct stat *statbuf);
pathname
:要查询的文件路径。
statbuf
:指向struct stat
类型的指针,用于保存获取到的文件元数据信息。
lstat()
函数返回0表示成功获取文件元数据。如果获取失败,返回-1,并设置errno
错误码。
与stat()
函数相比,lstat()
函数能够识别符号链接并获取其自身的信息,而不是指向的目标文件的信息。如果传递给lstat()
函数的路径名是一个符号链接,则返回符号链接本身的信息。
下面是一个使用lstat()
函数获取符号链接文件元数据的示例:
#include
#include
#include
#include
int main() {
const char *pathname = "symlink.txt";
struct stat file_stat;
int ret = lstat(pathname, &file_stat);
if (ret == -1) {
perror("lstat");
return 1;
}
printf("File Size: %lld bytes\n", file_stat.st_size);
printf("Mode: %lo (octal)\n", (unsigned long)file_stat.st_mode);
printf("Owner UID: %d\n", file_stat.st_uid);
printf("Last Access Time: %s", ctime(&file_stat.st_atime));
return 0;
}
在这个示例中,我们使用lstat()
函数获取的是一个名为symlink.txt
的符号链接文件的元数据。然后将结果保存在struct stat
类型的file_stat
结构体中。在打印时,我们获取了符号链接文件本身的大小、访问权限、所有者的用户ID以及最近访问时间。
fstat()
函数是一个系统调用,用于获取一个已经打开文件的元数据(文件状态信息),类似于stat()
函数。但是,fstat()
函数接受的是一个文件描述符而非文件路径作为参数。
#include#include #include int fstat(int fd, struct stat *statbuf);
fd
:打开文件的文件描述符。
statbuf
:指向struct stat
类型的指针,用于保存获取到的文件元数据信息。
fstat()
函数返回0表示成功获取文件元数据。如果获取失败,返回-1,并设置errno
错误码。
在调用fstat()
函数之前,需要先打开一个文件,并获取其文件描述符。
fstat()
函数与stat()
函数的功能相似,区别在于stat()
函数接受文件路径参数,而fstat()
函数接受文件描述符参数。
下面是一个使用fstat()
函数获取文件元数据的示例:
#include
#include
#include
#include
#include
int main() {
int fd = open("example.txt", O_RDONLY);
struct stat file_stat;
int ret = fstat(fd, &file_stat);
if (ret == -1) {
perror("fstat");
return 1;
}
printf("File Size: %lld bytes\n", file_stat.st_size);
printf("Mode: %o (octal)\n", file_stat.st_mode);
printf("Owner UID: %d\n", file_stat.st_uid);
printf("Last Access Time: %s", ctime(&file_stat.st_atime));
close(fd);
return 0;
}
在这个示例中,我们首先使用open()
函数打开文件example.txt
,获得文件描述符fd
。然后,我们使用fstat()
函数获取该文件的元数据,并将结果保存在struct stat
类型的file_stat
结构体中。
接着,我们打印了获取到的文件大小、文件访问权限、文件所有者的用户ID以及最近访问时间。
最后,我们使用close()
函数关闭文件描述符。