strcut stat结构体
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //指最近修改文件内容的时间
time_t st_ctime; //指最近改动Inoed的时间
};
错误码信息
error错误代码:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
int stat(const char *file_name, struct stat *buf)
头文件
#include <sys/stat.h>
#include <unistd.h>
参数1:文件名(绝对地址)
参数2:保存文件属性信息的结构体
返回值:成功返回0,失败返回-1;并设置错误码error
函数功能:通过文件名称获取文件的属性信息
例子:
#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
int main()
{
struct stat file_ms;
stat("/home/linux/1/server.c",&file_ms);
printf("文件设备编号st_dev =%ld\n",file_ms.st_dev);
printf("文件节点 =%ld\n",file_ms.st_ino);
printf("文件的类型和存取权限 =%ld\n",file_ms.st_mode);
printf("到达该文件的硬连接数目 =%ld\n",file_ms.st_nlink);
printf("用户ID =%ld\n",file_ms.st_uid);
printf("组ID =%ld\n",file_ms.st_gid);
printf("(若为设备文件)设备编号 =%ld\n",file_ms.st_rdev);
printf("文件字节数 =%ld\n",file_ms.st_size);
printf("块大小(文件系统的I/O缓冲区大小)=%ld\n",file_ms.st_blksize);
printf("块数 =%ld\n",file_ms.st_blocks);
printf("最后一次访问时间 =%ld\n",file_ms.st_atime);
printf("最近修改文件的内容的时间 =%ld\n",file_ms.st_mtime);
printf("最近改动Inoed的时间 =%ld\n",file_ms.st_ctime);
}
打印结果:
文件设备编号st_dev =2049
文件节点 =4205288
文件的类型和存取权限 =33204
到达该文件的硬连接数目 =1
用户ID =1000
组ID =1000
(若为设备文件)设备编号 =0
文件字节数 =1606
块大小(文件系统的I/O缓冲区大小) = 4096
块数 =8
最后一次访问时间 =1666256596
最近修改文件的内容的时间 =1666251242
最近改动Inoed的时间 =1666251242
int fstat(int filedes, struct stat *buf);
头文件
#include <sys/stat.h>
#include <unistd.h>
参数1::表文件的描述符
参数2:保存文件属性信息的结构体
返回值:成功返回0 ;失败返回-1;并设置错误码error
函数功能:通过代表文件的文件描述符获取文件属性信息并存放到指定的结构体
int lstat(const char *restrict pathname, struct stat *restrict buf);
头文件
#include <sys/stat.h>
#include <unistd.h>
参数1:代表文件的符号连接(软连接)地址
参数2:保存文件属性的结构体
返回值:成功返回0;失败返回-1;并设置错误码error;
函数功能:通过文件的符号连接(软连接文件)的地址获取文件属性并存放到指定结构体
stat和lstat的区别
lstat与stat相同,除非是符号链接,统计链接本身,而不是链接所引用文件。所以,stat和lstat的区别是:stat遵循链接,但lstat不是
无论是stat还是lstat,对于硬链接文件,都将其视为regular文件,不同点只在于符号链接(symlink)文件
对于stat(file, &mystat)这个系统调用,无论是读取regular文件还是symlink文件,通过mystat.st_mode获取到的文件类型都必然是regular文件,即S_ISREG(mystat.st_mode) == 1。
对于lstat(file, &mystat)这个系统调用,当file是symlink文件时,通过mystat.st_mode获取到的文件类型是link文件,即S_ISLNK(mystat.st_mode) == 1。