stat()系统调用用于获取文件信息:
int stat(const char *pathname,struct stat *statbuf);
返回一个由statbuf指向的stat结构:
struct stat{ dev_t st_dev; //设备ID ino_t st_ino; //i节点号 mode_t st_mode; //标识文件类型和指定文件权限 nlink_t st_nlink; //链接数目 uid_t st_uid; //属主 gid_t st_gid; //属组 ... time_t st_atime; //上次访问时间 time_t st_mtime; //上次修改时间 time_t st_ctime; //文件状态发生改变的上次时间 };
文件类型:
与常量 S_IFMT 相与(&),可从该字段中析取文件类型
if((statbuf.st_mode & S_IFMT) == S_IFREG) printf("常规文件\n"); //或者用测试宏: if(S_ISREG(statbuf.st_mode)) printf("常规文件\n");
表示文件类型的常量和测试宏如下:
文件权限:
t_mode 字段的低 12 位定义了文件权限。其中的前 3 位为专用位,分别是 set-user-ID 位、set-group-ID 位和 sticky 位,其余 9 位则构成了定义权限的掩码,定义了属主,属组,其他组对该文件的权限
A、检查文件权限:
int access(const char *pathname, int mode);
参数 mode 是由下表中常量相或(|)而成的位掩码。若由 pathname 所指定的文件具备mode 参数包含的所有权限,access()将返回 0。
B、更改文件权限:
int chmod(const char *pathname,mode_t mode);
参数mode如下表:
C、Set-User-ID、Set-Group-ID和 Sticky 位
Set-User-ID、Set-Group-ID前面已经解释过了。
Sticky位的作用:
为目录设置该位,则表明仅当非特权进程具有对目录的写权限,且为文件或目录的属主时,才能对目录下的文件进行删除(unlink()、rmdir())和重命名(rename())操作)
可藉此机制来创建为多个用户共享的一个目录,各个用户可在其下创建或删除属于自己的文件,但不能删除隶属于其他用户的文件。
同样使用chmod调用进行修改。
D、umask()屏蔽权限
mode_t umask(mode_t mask);
mask参数同上表,表示屏蔽表中的某项权限。
int utime(const char *pathname, const struct utimbuf *buf); struct utimbuf{ time_t actime; //访问时间 time_t modtime; //修改时间 }
int chown(const char *pathname, uid_t owner, gid_t group);
参数 owner 和 group 分别为文件指定新的用户 ID 和组 ID。
注意:A。只有特权级进程才能使用 chown()改变文件的用户 ID
B。如果文件组的属主或属组发生了改变,那么 set-user-ID 和 set-group-ID 权限位也会随之关
闭,防止出现:普通用户若能打开某一可执行文件的 set-user-ID位,然后再设法令其为某些特权级用户所拥有,就能在执行该文件时获得特权用户身份。