linux服务器开发(获取文件属性信息)stat()函数

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。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值