【每日一函数】fstat 函数介绍及代码示例

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 以获取更详细的错误信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LavenLiu

常言道:投资效率是最大的投资。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值