本文主要介绍linux stat函数的讲解(整理),很不错,有参考价值。有需要的朋友可以参考一下。
stat函数讲解
头文件:
#包含系统/统计信息
#包括unistd.h
定义功能:
int stat(const char *file_name,struct stat * buf);
功能描述:
通过文件名获取文件信息,保存在buf指示的结构stat中。
返回值:
如果执行成功,则返回0,如果执行失败,则返回-1,错误代码存储在errno中。
错误代码:
ENOENT参数file_name指定的文件不存在。
ENOTDIR路径中的目录存在,但不是真正的目录。
ELOOP要打开的文件有太多的符号连接,最大数量是16个符号连接。
默认参数buf是一个无效指针,指向不存在的内存空间。
EAC被拒绝访问该文件
ENOMEM核心内存不足。
ENAMETOOLONG参数file_name的路径名太长。
#包含系统/统计信息
#包括unistd.h
#包含stdio.h
int main() {
struct stat buf
stat(/etc/hosts ,buf);
printf(/etc/hosts文件大小=%dn ,buf . ST _ size);
}
-
结构状态
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//文件字节数(文件大小)
无符号长整型st _ blksize//块大小(文件系统的I/O缓冲区大小)
无符号长整型st _ blocks//块数
time _ t st _ atime//上次访问时间
time _ t st _ mtime//上次修改时间
time _ t st _ ctime//上次更改的时间(引用属性)
};
前面描述的st_mode定义了以下情况:
文件类型的位掩码
S_IFSOCK 0140000 scoket
S _ IFLNK 0120000符号连接
S_IFREG 0100000通用文件
S_IFBLK 0060000块设备
S_IFDIR 0040000目录
S_IFCHR 0020000字符设备
S_IFIFO 0010000 FIFO
在s _ isud04000文件的执行位设置user-id
S_ISGID 02000文件的(执行时设置组id)位
S_ISVTX 01000文件的粘性位
S_IRUSR(S_IREAD) 00400文件所有者有读取权限。
文件所有者有写权限。
文件所有者拥有可执行的权限。
S_IRGRP 00040用户组有读取权限。
S_IWGRP 00020用户组具有可写权限。
S_IXGRP 00010用户组拥有可执行权限。
S_IROTH 00004其他用户有读取权限。
其他用户有写权限。
其他用户拥有可执行权限。
上面的文件类型定义了POSIX中的宏定义来检查这些类型:
S_ISLNK (st_mode)确定是否是符号连接。
S_ISREG (st_mode)是通用文件吗?
S_ISDIR (st_mode)是目录吗?
S_ISCHR (st_mode)是字符设备文件吗?
S_ISBLK (s3e)是FIFO吗?
S_ISSOCK (st_mode)是套接字吗?
如果一个目录有sticky bit (S_ISVTX),说明这个目录下的文件只能由文件所有者、目录所有者或root删除或重命名。
-
结构统计信息{
长f _ type//文件系统类型
long f _ bsize//块大小
长f _ blocks//多少钱?
long f _ bfree//空闲块
长f _ bavail//可用块
长f _ files//文件节点总数
long f _ ffree//自由文件节点
fsid _ t f _ fsid//文件系统id
long f _ namelen//文件名的最大长度
long f _ spare[6];//备用以备后用
};
stat、fstat和lstat函数(UNIX)
#包含系统/类型. h
#includesys/stat.h
int stat(const char * restrict pathname,struct stat * restrict buf);
提供文件名并获取文件的相应属性。文件没打开一般都是这种感觉。
int fstat(int filedes,struct stat * buf);
通过文件描述符获取文件对应的属性。打开文件后执行此操作。
int lstat(const char * restrict pathname,struct stat * restrict buf);
连接文件
返回三个函数:0表示成功,1表示错误。
给定一个路径名,stat函数返回一个与指定文件相关的信息结构,fstat函数获取关于在描述符filedes上打开的文件的信息。lstat函数类似于stat,但是当命名文件是符号连接时,lstat返回关于符号连接的信息,而不是关于符号连接引用的文件的信息。
第二个参数是指向我们应该提供的结构的指针。这些函数填充buf指向的结构。这种结构的实际定义可能因实现而异,但其基本形式是:
结构状态
mode _ t st _ mode/*文件模式(权限)*/
ino _ t st _ ino/* I=节点号(序列号)*/
dev _ t st _ rdev/*特殊文件的设备号*/
nlink _ t st _ nlink/*链接数量*/
uid _ t st _ uid/*所有者的用户id */
gid _ t st _ gid/*所有者的组ID */
off _ t st _ size/*常规文件的字节大小*/
time _ t st _ atime/*上次访问的时间*/
time _ t st _ mtime/*上次修改时间*/
time _ t st _ ctime/*上次文件状态更改的时间*/
long st _ blksize/*最佳I/O块大小*/
长st _ blocks/*分配的512字节块的数量*/
};
请注意,除了最后两个成员,所有成员都是基本系统数据类型。我们将解释这个结构的每个成员以理解文件属性。
最常用的stat函数是ls-l命令,它可以获取文件的所有信息。
1函数是获取文件的属性(普通文件、目录、管道、套接字、字符、块())。
函数原型
#包含系统/统计信息
int stat(const char * restrict pathname,struct stat * restrict buf);
提供文件名并获取文件的相应属性。
int fstat(int filedes,struct stat * buf);
通过文件描述符获取文件对应的属性。
int lstat(const char * restrict pathname,struct stat * restrict buf);
连接文件描述以获取文件属性。
2对应于文件的属性
结构状态
mode _ t st _ mode//模式、文件、目录等。对应于该文件
ino _ t st _ ino//inode节点号
dev _ t st _ dev//设备号
dev _ t st _ rdev//特殊设备号
nlink _ t st _ nlink//文件的连接数
uid _ t st _ uid//文件所有者
gid _ t st _ gid//文件所有者对应的组
off _ t st _ size//普通文件,对应文件字节
time _ t st _ atime//上次访问文件的时间
time _ t st _ mtime//上次修改文件内容的时间
time _ t st _ ctime//文件状态更改时间
blksize _ t st _ blksize//对应于文件内容的块大小
blkcnt _ t st _ blocks//对应于魏健内容的块数
};
您可以通过上面提供的函数返回一个保存文件信息的结构。
以上是边肖介绍的linux stat函数的讲解(整理)。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!