zoukankan      html  css  js  c++  java
  • 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 给可执行文件设置粘性位与对目录设置粘性位,完全是基于不同的考虑,前者是为了提升性能,而后者是为了实现“在公用目录,保证只有文件属主或者超级用户才有权利删除和更名,而其他用户不能删除和更名不属于他的文件”

  • 相关阅读:
    PHP常见问题总结
    Java常见问题总结(二)
    C语言常见问题总结
    C#常见问题总结(三)
    C#常见问题总结(二)
    Android常见问题总结(二)
    日期和时间类函数
    Eclipse开发工具介绍
    JavaScript中逻辑运算符的使用
    多路开关模式的switch语句
  • 原文地址:https://www.cnblogs.com/AndyChen1/p/8512291.html
Copyright © 2011-2022 走看看