stat系列函数介绍(stat,lstat,fstat)

stat结构体

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()

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()

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()

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()函数关闭文件描述符。

你可能感兴趣的:(重要知识点块,java,前端,linux,c++)