linux系统编程-文件属性

1.stat()获取文件信息

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; //文件状态发生改变的上次时间
};
  • st_mode字段文件类型和文件权限相关,位掩码布局:
    linux系统编程-文件属性

文件类型:

与常量 S_IFMT 相与(&),可从该字段中析取文件类型

if((statbuf.st_mode & S_IFMT) == S_IFREG)
	printf("常规文件\n");
//或者用测试宏:
if(S_ISREG(statbuf.st_mode)) 
	printf("常规文件\n");

表示文件类型的常量和测试宏如下:

linux系统编程-文件属性
文件权限:
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。

linux系统编程-文件属性
B、更改文件权限:

int chmod(const char *pathname,mode_t mode);

参数mode如下表:
linux系统编程-文件属性

linux系统编程-文件属性

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参数同上表,表示屏蔽表中的某项权限。

  • st_atime、st_mtime 和 st_ctime 字段
    如何修改文件的时间戳:utime()调用
int utime(const char *pathname, const struct utimbuf *buf);
struct utimbuf{
	time_t actime; //访问时间
	time_t modtime; //修改时间
}
  • st_uid和st_gid字段
    如何改变文件的属主和属组?chown()调用
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位,然后再设法令其为某些特权级用户所拥有,就能在执行该文件时获得特权用户身份。

上一篇:screen 查看历史输出,方便自己查看


下一篇:python中函数与函数式编程(二)