这里要稍微写一些linux下复杂的权限管理,应该只是一小部分知识,还有一些关于cap的东西以后再看。
与process关联的ID
谁execute这个process的人称为real user id,应该就是登陆时使用的user
real group id也一样.
一般在一个登陆Session中,这两个值都不会改变,但是超级用户进程可以改变
像Android中每个APK有独自的User id,然后类似rild之类的native deamon process就会尝试改变自己的user id为类似radio之类的东西。
在运行中检查权限所使用的id称为有效用户id,effective user id
然后还有有效组ID
附加组ID
一般有效用户ID == 真实用户ID, 有效组ID == 真实组ID
但是如果在可执行文件的st_mode中有设置 set-user-ID/set-group-ID
那在执行这个文件的时候 有效用户ID和有效组ID会变成文件的owner
一般有设置set-user-ID/set-group-ID的程序都会获得额外的权限
关于文件权限,有一些容易引起误解的,也还有一些我自己也没有理解清楚的
文件权限比较好理解,O_TRUNC需要文件具有写权限。
文件夹的写权限,应该就是类似能不能在其中create/update/delete文件和文件夹
文件夹的读权限,应该就是读文件夹里面的文件/文件夹列表,通常我们 ls 当前文件夹就必须具有读权限
文件夹的执行权限,这个东西听说又叫搜索位,通常我们cd XXX,就必须在当前文件夹下搜索XXX是否存在,然后就是当我们访问类似这种很长路径的文件/aaa/bbb/ccc/dd.txt
对aaa,bbb,ccc必须具有执行权限,就是搜索
一般如果具有读权限就应该就可以搜索,如果这之前有区别,就是应该是搜索的范围大于能读到的内容。
也就是之后需要知道一个Folder本身里面有写什么内容,我目前知道的是一定有当前的文件列表--> TODO: 看情景分析 or 去看下 ls 的实现,ls里面有比较多参数有些是需要x的有些是需要r的,例如 ls -l如果没有执行权限就只能拿到 name ,能知道是folder还是file,除此之外其他的东西都拿不到,文件本身的权限,user,group
-->linux目录中记录的应该是只有两个东西 inode & name.这与文件系统的实现有关。
另外增删文件都需要WX权限
另外内核对文件操作权限的判断顺序...如果是owner就会看owner权限,group权限就不会看了,如果在group中则others也就不看了,这个逻辑上正常,而且可以想一下kernel的实现,一定是if-else的判断出结果后直接返回。
这里就要提如果新建文件/文件夹的时候文件夹的owner user id和group id是谁
user id会是process 有效用户ID
group id可以有两种选择父folder的group id;or process有效组ID
linux中根据文件系统的不同有的可以在mount fs的时候选择
文件长度: st_size
lseek到文件末尾之后的空间,会照成文件空洞
文件长度会+空洞的大小,但是这些空洞未必会占用磁盘空间。
du 命令可以看磁盘空间大小
符号链接和所谓的硬链接完全是两回事,建议细读4.14,不要去上网search类似我这种自己记录给自己看的blog...:(
这章内容比较多而且杂,主要是stat中的每个参数的意义,需要思考想清楚的东西也比较多,有比较多关于文件操作的System Call
作业开始:
之后只写有点意义的题目,无意义的也没什么可以写的pass
4.1 stat和lstat的区别,stat基本不会关心是否是S_IFLNK(符号链接),应该是看到S_IFLNK会往下去找真正的File,然后拿到属性值
而lstat旁道S_IFLNK则会直接返回。第一次看到这样的函数设计怪怪的,我的初始感觉是反的。我觉得stat是一个common的设计,不会针对不同的File类型来做一些区别。Orz...最后不是。
4.2 umask 777意味着rwxrwxrwx全部变没掉,但是这也没关系,不知道出题人的意思
4.5 目录和符号链接的长度不可能为0,目录创建出来就会包含. 和 ..而且 . 的inode指向自己本身会占磁盘空间,符号链接肯定也是不能为0的,其中有存指向的链接path
4.6 这个有点意思,后面贴代码
4.7 这个看了下答案,没看懂>为什么kernel默认的创建文件赋予的权限“可能会,也可能不会”受unmask的值的影响?
4.8 du df的区别...
4.9 ~ 后面的题大概看了下,不想写了,好多细节...