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 給可執行文件設置粘性位與對目錄設置粘性位,完全是基於不同的考慮,前者是爲了提升性能,而後者是爲了實現“在公用目錄,保證只有文件屬主或者超級用戶纔有權利刪除和更名,而其他用戶不能刪除和更名不屬於他的文件”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章