stat()函数、fstat()函数和lstat()函数

简介: stat()函数、fstat()函数和lstat()函数

这里介绍三个关于文件属性的核心函数: stat() 函数、 fstat() 函数和 lstat() 函数以及其所返回的信息。


语法如下:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);点击复制复制失败已复制


stat() 函数得到一个与 path 所指定的文件有关的信息结构,并保存在第二个参数 buf 中。 fstat() 函数需要将文件打开之后的文件描述符作为参数,其功能与 stat() 函数一致。 lstat() 函数类似于 stat() 函数,只不过其参数 path 指向的文件是一个符号链接。 lstat() 函数返回符号链接的有关信息,而不是由该符号链接引用的文件的信息。


第二个参数 buf 是一个结构体指针,它指向一个已定义的结构体,该结构体的实际定义可能会随实现的不同而有所不同。其基本形式如下所示:

struct stat
{
  __dev_t st_dev;        /* Device.  */
  __ino_t st_ino;        /* File serial number.    */
  __ino_t __st_ino;            /* 32bit file serial number.    */
  __mode_t st_mode;            /* File mode.  */
  __nlink_t st_nlink;            /* Link count.  */
  __nlink_t st_nlink;        /* Link count.  */
  __mode_t st_mode;        /* File mode.  */
  __uid_t st_uid;        /* User ID of the file's owner.    */
  __gid_t st_gid;        /* Group ID of the file's group.*/
  int __pad0;
  __dev_t st_rdev;        /* Device number, if device.  */
  unsigned short int __pad2;
  __off_t st_size;            /* Size of file, in bytes.  */
  __off64_t st_size;            /* Size of file, in bytes.  */
  __blksize_t st_blksize;    /* Optimal block size for I/O.  */
  __blkcnt_t st_blocks;        /* Number 512-byte blocks allocated. */
  __blkcnt64_t st_blocks;        /* Number 512-byte blocks allocated. */
  /* Nanosecond resolution timestamps are stored in a format
      equivalent to 'struct timespec'.  This is the type used
      whenever possible but the Unix namespace rules do not allow the
      identifier 'timespec' to appear in the <sys/stat.h> header.
      Therefore we have to handle the use of this header in strictly
      standard-compliant sources special.  */
  struct timespec st_atim;        /* Time of last access.  */
  struct timespec st_mtim;        /* Time of last modification.  */
  struct timespec st_ctim;        /* Time of last status change.  */
  __time_t st_atime;            /* Time of last access.  */
  __syscall_ulong_t st_atimensec;    /* Nscecs of last access.  */
  __time_t st_mtime;            /* Time of last modification.  */
  __syscall_ulong_t st_mtimensec;    /* Nsecs of last modification.  */
  __time_t st_ctime;            /* Time of last status change.  */
  __syscall_ulong_t st_ctimensec;    /* Nsecs of last status change.  */
  __syscall_slong_t __glibc_reserved[3];
  unsigned long int __glibc_reserved4;
  unsigned long int __glibc_reserved5;
  __ino64_t st_ino;            /* File serial number.    */
};点击复制复制失败已复制


提示

上述文件内容来自于 Ubuntu 20.04 操作系统的 /usr/include/x86_64-linux-gnu/bits/stat.h 文件,经过一些定义删减。


这样通过读取第二个参数的结构体成员,就可以获取文件的属性,我们先建立一个 test.txt 测试文件,里面写入 hello world 测试内容,然后新建 main.c 文件,写入如下内容:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[]) {
  struct stat buf;
  if (stat("test.txt", &buf) == 0) {
    printf("%d %d %d \n", buf.st_uid, buf.st_gid, buf.st_size);
  }
  return;
}点击复制复制失败已复制


接下来编译并执行:

$ gcc main.c
$ ./a.out    
1000 1000 11点击复制复制失败已复制


程序得到文件的 所属用户的ID1000 ,其 用户所在组ID1000 ,文件的大小11字节。如果需要得到文件的更多信息,选择更多的信息输出即可。

目录
相关文章
|
2月前
|
关系型数据库 Unix Shell
File - os.tcsetpgrp(fd, pg)函数
`os.tcsetpgrp(fd, pg)` 函数在进行进程控制和信号管理时非常有用,但它涉及Unix底层的工作原理,因此使用时需具备相应知识,以确保正确和适用,并注意相关的权限和错误处理。
146 61
|
6月前
|
算法 Unix Linux
select函数中的文件描述符(File Descriptor)范围
select函数中的文件描述符(File Descriptor)范围
75 0
select函数中的文件描述符(File Descriptor)范围
|
6月前
|
存储 Linux
Linux文件编程(lseek函数和stat函数)
Linux文件编程(lseek函数和stat函数)
98 0
Linux文件编程(lseek函数和stat函数)
|
6月前
|
机器学习/深度学习
fprintf()函数和fwrite()函数
fprintf()函数和fwrite()函数
66 1
|
6月前
|
存储 Linux C语言
Linux获取文件信息的利器stat,fstat,lstat,fstatat
stat系列函数是C语言中的一个系统调用函数,用于获取文件的信息。通过提供文件路径,它能够返回包含文件属性的结构体数据。
141 0
|
6月前
|
Linux
内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs
内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs
586 0
系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)
系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)
152 0
系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)
|
物联网 Linux C语言
Execve 函数|学习笔记
快速学习 Execve 函数
Execve 函数|学习笔记
|
存储 数据安全/隐私保护 开发者
Stat 结构体 | 学习笔记
快速学习 Stat 结构体
117 0