15.Linux/Unix 系统编程手册(上) -- 文件属性

1.文件权限
	stat 结构中 st_mod 字段的低 12 位定义了文件的权限。其中的前 3 位为专用位,分别是 set-user-ID, set-group-ID
  和 sticky 位。

2.目录权限
	读权限:可列出目录之下的内容。
	写权限:可在目录内创建,删除文件。
	可执行权限:可访问目录中的文件。

	访问文件时,需要拥有对路径名所列所有目录的执行权限
	拥有对目录的读权限,用户只是能看目录中的文件列表

	例如,想要访问 /home/mtk/x, 则需要对目录 /, /home 以及 /home/mtk 的执行权限。
	若当当前的工作目录为 /home/mtk/sub1, 访问相对路径名为  ../sub2/x,需握有 /home/mtk 和 
  /home/mtk 和 /home/mtk/sub2 这2个目录的可执行权限(不必对 / 或者 /home 的可执行权限)。

3.权限检查算法
	只要在访问文件和目录的系统调用中,指定了路径名称,内核就会检查相应文件的权限。如果赋予系统调用的路径名
  还包括目录前缀时,那么内核除去会检查对文件本身所需的权限以外,还会检查前缀锁包含每个目录的可执行权限。内核会
  使用进程的有效用户ID,有效组ID以及辅助ID,来执行权限检查(准确来说,Linux 内核会使用文件系统用户ID和组ID)。

    一旦调用 open()打开了文件,针对返回描述符的后续系统调用(比如,read(), write(), fstat(), fcntl() 以及 mmap())
  将不再进行权限检查。

    检查文件权限时,内核所遵守的规则如下:
    	1.对于特权进程,授予其所有访问权限;
    	2.若进程的有效ID与文件的用户ID(属主)相同,内核会根据文件的属主权限,授予进程相应的访问权限。
    	3.若进程的有效组ID或任意附属组ID与文件的组ID相匹配,内核会根据文件的属组权限,授予进程对文件的相应访问权限。
    	4.若以上3点都不满足,内核会根据文件的 other 权限,授予进程相应的权限.

    检查特权进程的权限:
    	若进程为特权进程,则内核在检查权限时将授予进程所有的访问权限。这一论述的成立,其实还加个限制条件。对于非目录文件,
      仅当该文件的3种权限类型之一具有可执行权限时,Linux 才会将该权限赋予一特权进程。

4.Set-User-ID, Set-Group-ID 和 Sticky 位
	在现代Unix(包括Linux)实现中,sticky 权限位所起的作用全然不同于老的Unix实现。作用于目录时,sticky 权限位起限制删除位的
  作用。该目录设置该位,则表明仅当非特权进程具有对该目录的写权限,且为文件或者目录的属主时,才能对目录下的文件进行删除(unlink(),rmdir()),
  和重命名(rename())操作。可籍此机制来创建为多个用户共享一个目录,各个用户可在旗下创建或删除属于自己的文件,但不能删除属于其他用户的文件。
    若对文件开启了 sticky 位,则 ls -l 会显示 T, 大小写显示了是否对文件开启了其他用户执行权限位(o+x 权限)。
    chmod +t

5.进程的文件模式创建掩码: umask()
	umask() 是一种进程属性,当进程新建文件或目录时,该属性用于指明应屏蔽哪些权限位。
	进程的 umask 通常继承其父 shell.大多数 shell的初始化文件会将 umask 设置为默认的 022(----w--w-)。其含义为对于同组或者其他用户,应
  总是屏蔽写权限。因此,假定 open()中 mode 参数为, 0666,那么对于新创建的文件来说,其属主拥有读写权限,所有其他用户具有读权限(rw-r--r--)。
  同理,对于mkdir()的 mode 参数为 0777,那么新创建的目录权限为,(rwxr-xr-x)

6. i节点标志 
	lsattr
	chattr +ai
	ioctl()

stat();
lstat();
fstat();
major();
minor();
utime();
utimes();
futimes();
lutimes();
utimensat();
futimens();
chown();
fchown();
lchown();
access();
umask();
chmod();
fchmod();
lsattr // shell
chattr


猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/82315970