首页 > 代码库 > 文件和目录详解(一)---stat、lstat和fstat函数详解

文件和目录详解(一)---stat、lstat和fstat函数详解

    记录文件属性的相关数据结构都是存在于内核空间中,在进程的用户空间中是直接访问不到这些数据结构的,只能通过操作系统提供的系统调用来访问。而stat等函数就是操作系统为用户进程提供的用来获取文件属性的系统调用。
=======================================================
函数原型:
技术分享
技术分享
函数参数:
  • path:要操作文件的路径名
  • fd:要操作的文件描述符
  • buf:存放读取出来的文件属性
返回值:
  • 调用成功时返回 0 
  • 调用失败时返回 -1
========================================================
    lstat函数和stat函数作用是类似的,只不过当要读取的文件是符号链接文件时,lstat函数获取的是符号链接文件的属性,而stat函数获取的是符号链接文件指向的实际文件的属性。
    结构体struct stat用来存放读取出来的文件属性,其内部的成员如下图所示
技术分享
技术分享
=======================================================
    文件读写权限和类型是存放在文件的struct inode结构体中的i_mode变量中,mode_t基本数据类型实质上是short类型,占用两个字节一共16位。这16位中的前4位用来表示文件的类型。中间3位表示权限修饰位,后面9位代表所有者、同组用户以及其他用户的权限
    Linux提供了一些特殊的宏给用户进程使用以判断文件的类型,由于Linux中有 7 种类型的文件,所以对应有 7 种判断文件类型的宏。这 7 种宏分别是:
S_ISREG(buf.st_mode)        (普通文件)
S_ISDIR(buf.st_mode)         (目录文件)
S_ISBLK(buf.st_mode)         (块设备文件)
S_ISCHR(buf.st_mode)        (字符设备文件)
S_ISLNK(buf.st_mode)        (符号链接文件)
S_ISFIFO(buf.st_mode)        (有名管道文件)
S_ISSOCK(buf.st_mode)      (套接字文件)
 
    Linux中还提供了两个用来表示set-user-id和set-group-id两位(权限修饰位)的宏,这两位主要会影响到进程的有效用户 ID 和进程实际用户 ID 的。详情参见笔记“与进程有关的ID”。
S_ISUID       (设置了set-user-id位)
S_ISGID       (设置了set-group-id位)
 
    Linux中提供了9个表示所有者、同组用户以及其他用户的权限的宏。
S_IRUSR        (用户读权限)
S_IWUSR        (用户写权限)
S_IXUSR          (用户执行权限)
S_IRGRP          (同组用户读权限)
S_IWGRP         (同组用户写权限)
S_IXGRP        (同组用户执行权限)
S_IROTH        (其他用户读权限)
S_IWOTH        (其他用户写权限)
S_IXOTH        (其他用户执行权限)
 
 

文件和目录详解(一)---stat、lstat和fstat函数详解