加入CSDN是出于记录,希望有不足之处多加指正。
1、文件属性
获取文件的元数据(类型、权限、大小等等)
头文件:
#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);
参数分析:
path --> 文件路径
fd -->文件描述符
buf -->文件属性的结构指针
返回值:
成功: 返回 0
失败: 返回 -1,错误号码会被设置
实例:
struct stat
{
dev_t st_dev; //主设备号
ino_t st_ino; // I节点的号码,相当于身份证
mode_t st_mode; //文件类型+权限
nlink_t st_nlink; //文件的链接数
uid_t st_uid; //文件拥有者ID
gid_t st_gid; //文件所属小组
dev_t st_rdev; //次设备号
off_t st_size; //文件大小
blksize_t st_blksize;
blkcnt_t st_blocks;
......
};
2、设备号
linux 系统为了方便管理,为每一个设备分配了一个主设备号,用来规范设备的类型。次设备号用来规范设备在本系统中的序号,设备号是一个系统的资源,在设备加载的时候已经分配完毕(驱动安装的时候)。
int major(dev_t dev); //从dev 中获取主设备号
int minor(dev_t dev); //从dev 中获取次设备号
3、文件类型与权限
st_mode[0:8] --对应代表了文件的各个用户权限。
st_mode[9]存储了所谓的粘住为(只对目录有限),在拥有该目录的写权限的情况下,如果这一位被设置为1,那么某一用户也只能删除在本目录下属于自己的文件,否则可以删除任意文件。
st_mode[10] 和 st_mode[11] 分别用来设置文件的suid(只对普通文件有效) 和sgid(只对目录有效)。如果suid被设置为1,则任何用户在执行该文件的时候均会获得该文件所有者的临时授权,即其有效UID将等于文件所有者的UID。如果sgid 被设置为1,则任何在该目录下执行的程序均会获得该目录所属成员的临时授权,即其有效GID将等于该目录的所属组成员的GID.
st_mode [12:15] 用以标识Linux 下不同的文件类型,由于Linux 总共只有7种文件类型,因此4位足以表达。