APUE_第4章 文件和目录

本文详细介绍了UNIX系统中关于文件和目录的相关概念,包括文件类型、权限设置、文件访问、所有权变更、文件长度、文件截短、文件系统结构以及各种与文件操作相关的函数,如stat、chmod、link、unlink等。此外,还讨论了硬链接、符号链接、设备特殊文件和访问时间戳等内容,是理解UNIX文件系统的重要参考资料。
摘要由CSDN通过智能技术生成

4.1 文件和目录

stat数据结构中包含有文件的基本信息,

4.2 stat, fstat, lstat函数

//restrict关键字表明,只能通过这一个指针访问这一个对象,这样有利于编译器优化,不会产生内存别名;

int stat(const char *restrict pathname, struct stat *restrict buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *restrict pathname, struct stat *restrict buf);//返回符号链接有关的信息,而不是符号链接引用的文件的信息;

stat数据结构的成员变量

struct stat{
   
	mode_t st_mode;	//文件类型, 文件模式, 文件权限
	ino_t st_ino;	//i节点数量
	dev_t st_dev;
	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;	//上一次文件属性更改时间
	blksize_t st_blksize;	//块大小
	blkcnt_t st_blocks;		//块数目
};
	

4.3 文件类型

1) 普通文件
或是二进制文件, 或是文本文件, 对普通文件的解释由应用程序解释
2) 目录文件
每一个目录项下都是该目录下所有的文件, 对目录文件具有读权限,可以访问该目录的所有目录项,但是只有内核具有写目录的权限;(进程陷入内核中才能写目录项);
3) 块特殊文件
每次对设备进行带缓冲的访问,每次访问以固定长度的单位进行;
4) 字符特殊文件
对设备不带缓冲的访问, 每次访问的长度可变;
系统中所有设备要么是字符特殊文件, 要么是块特殊文件;
5) FIFO(也叫命名管道)
6) 套接字
网络间通信文件
7) 符号链接
指向另一个文件;
在这里插入图片描述
POSIX允许将进程间通信对象(消息队列, 信号量, 共享存储对象)作为文件其参数并非st_mode,而是指向stat的指针;
1) S_TYPEISMQ (); //是否是消息队列
2) S_TYPEISSEM(); //是否是信号量
3) S_TYPEISSHM(); //是否是共享内存

判断文件类型的函数是宏,一般定义如下:

#define S_ISDIR(mode)	(((mode) & S_IFMT) == S_IFDIR

4.4 设置用户ID和设置组ID

与进程相关的ID以下6个,与文件相关的ID只有st_uid(文件所有者) 和 st_gid(文件组所有者)
1) 实际用户ID和实际组ID(文件属性)
标记我们是谁,这两个ID在登录时候取自口令文件的登录项,即登录用户ID和登录组ID;
2) 有效用户ID和有效组ID(进程属性)
决定了我们的文件访问权限。或是等于实际用户ID或是实际组ID, 或是等于文件所有者的ID;
3) 保存的设置用户ID和保存的设置组ID
通常情况下,有效用户ID = 实际用户ID, 有效组ID = 实际组ID;
每个文件都有自己的所有者和组所有者,即stat中的st_uid 和st_gid;

文件模式中有两位称为设置用户ID位和设置组ID位。
如果没有被置位, 进程的有效用户ID为实际用户ID,进程的有效组ID为实际组ID;
如果被置位了, 进程的有效用户ID为文件所有者ID(st_uid), 进程的有效组ID为文件的所有者组ID(st_gid);

如果文件的所有者是超级用户, 然后设置了用户ID位,会导致进程的有效用户为超级用户,进程得到超级权限,将会带来风险,需要特别注意运行设置了用户ID的程序;
设置用户ID位和设置组ID位都包含在st_mode中。可以使用S_ISUID 和 S_ISGID进行测试;

4.5 文件访问权限

在这里插入图片描述
第一个规则:
打开文件/usr/include/stdio.h, 需要对路径上所有的目录都具有执行权限;
区别对目录的读权限和执行权限:对目录的读权限允许我们使用open得到目录流,访问每一个目录项;对目录的执行权限表示我们可以通过该目录访问到子文件;

进程每次打开、创建或是删除一个文件, 内核都进行文件访问权限测试,涉及文件的所有者, 进程的有效ID:

进程每次打开、创建或是删除一个文件时, 内核就进行文件访问权限测试:
内核以下面次序进行测试:
1) 如果进程的有效用户ID是0, 允许访问。超级用户权限拥有对整个文件系统的访问权限;
2) 进程的有效用户ID = 文件的所有者ID, 如果所有者适当的访问权限位被设置, 就允许访问。适当的访问权限指的是:
若进程为读打开该文件, 则用户读位应当是1;
如进程为写打开该文件, 则用户写位应当是1;
若进程将执行该文件,则用户执行位是1;
3) 若进程的有效组ID或进程的附加组ID = 文件的组ID, 那么若组适当的访问权限位被设置, 就允许访问, 否则拒绝访问;
4) 若其他用户适当的访问权限位被设置, 则允许访问, 否则拒绝访问;

4.6 新文件和目录的所有权

如果进程创建了文件,这个文件的st_uid和st_gid是什么?
新文件的用户ID设置为进程的有效用户ID。
新文件的组ID为:
1) 新文件的组ID可以是进程的有效组ID

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值