• unix/linux中的粘性位


    我们先来看看chmod()函数的原型:
      #include 
      #include 
      int chmod(const char *pathname,mode_t mode);
      其第一个常数是路径名,用来指定需要修改权限位的文件,我们这里要注意的是第二个常数,它是mode_t类型,*_t意味着它是原始系统数据类型(primitive system type),mode可以是多个常数的逐位或运算,参见《unix环境高级编程》第四章4.9节的表4-6
      在表4-6中,我们发现其中有一个常数S_ISVTX。这个常数跟粘住位有关,如果mode参数里有这一个常数参与或运算,就将设置粘性位。如果一个文件或者目录设置了粘性位,ls -l命令显示的时候,会用t来表示。
      关于S_ISVTX位,有一段有趣的历史。在早期的unix版本中,一个文件如果被设置了粘性位,那么在该脚本或者程序第一次执行并结束的时候,该程序的正文部分(程序的机器指令部分)将被保存在交换区里。因为在交换区,文件是被连续存放的,而在一般的unix文件系统中,文件的各个数据块是随机存放的,所以程序的正文部分被放在交换区之后,将使得下次执行该程序时能较快地将其装入内存。因此,对于常用的应用程序,设置它们的粘性位可以提高它们执行的速度,系统的性能随之上升,可见设置粘性位,尤其是对常用的执行程序设置粘性位是一种有用的技术。但很显然,由于交换区的空间大小是固定的,因此在交换区里,同时能存放的设置了粘性位的程序的数量是受到限制的。因为在系统再次自举前,这些执行程序的正文部分总是“粘”在交换区中的,所以就有了粘性位这样的叫法。后来的unix版本,把粘性位叫做保存-正文位(saved-text bit),因此就有了上面的S_ISVTX位。现在较新的unix系统,包括linux,大多数都具有虚存系统以及快速文件系统,而且随着计算机技术的发展,内存也越来越大,所以,可执行程序使用粘性位来提高运行性能实际上已经不在需要。
      所以,在现在的unix系统中,粘性位的概念,主要是为了给目录设置粘性位,而不是为了给可执行程序设置粘性位,以提高系统性能。但是,给目录设置粘性位的目的与给可执行程序设置粘性位是截然不同的。给目录设置粘性位的目的是:
      如果对一个目录设置了粘性位,则只有文件属主或者超级用户才能删除/更名该目录下的文件。(当然,文件属主还必须拥有对该目录的写、执行权限)。
      任何一种技术,都有其实际需求,没有实际需求的技术是不会产生的。最简单的举个现成的例子,就是上面讲到的给可执行程序设置粘性位这一技术,其实际需求是提升系统性能。同样地,给目录设置粘性位,其必然也有其现实中的需求。
      我们知道,unix/linux系统是一个多用户系统,一个unix系统可能有许多用户,同时/不同时的登陆,他们在自己的家目录创建文件,但也可能在一些公有文件夹里创建文件,典型的就是/tmp目录,这是一个任何用户在里面都可以创建文件的目录,而且任何用户对/tmp目录都具有读/写/执行权限,这意味着任何用户都可以删除/更名该目录下的文件。显然,对于/tmp这种公用目录,当然要使用一定的机制,来阻止“任何用户都可以删除/更名该目录下的文件”这种不该出现的现象,保证该目录下的文件,只有其文件属主才可以删除和更名,而其他用户不能删除和更名不属于他的文件。给/tmp目录设置粘性位,就实现了这一功能!(注意:在/tmp目录下,其他用户对不属于他的文件是否具有读/写/执行权限,按照×××××××××九个权限位的组合正常实现!)
      讲完了,我们来做最后的总结吧:
      1 粘性位是一个历史的概念,对可执行文件设置粘性位与对目录设置粘性位在历史上不是同时的,而是错开的
      2 给可执行文件设置粘性位与对目录设置粘性位,完全是基于不同的考虑,前者是为了提升性能,而后者是为了实现“在公用目录,保证只有文件属主或者超级用户才有权利删除和更名,而其他用户不能删除和更名不属于他的文件”

  • 相关阅读:
    无法重用Linq2Entity Query
    The Joel Test
    MSBuilder directly instead of default VSComplie with keyborad shotcut 原创
    客户端缓存(Client Cache)
    关于代码重构和UT的一些想法,求砖头
    ExtJS2.0实用简明教程 应用ExtJS
    Perl information,doc,module document and FAQ.
    使用 ConTest 进行多线程单元测试 为什么并行测试很困难以及如何使用 ConTest 辅助测试
    史上最简单的Hibernate入门简介
    汽车常识全面介绍 传动系统
  • 原文地址:https://www.cnblogs.com/AndyChen1/p/8512291.html
Copyright © 2020-2023  润新知