2012-02-08 73 views
0

這是我不明白的東西。在Perl中,讓我們說我有一個文件(句柄)$file然後將權限傳遞給perl的chmod和mkdir函數

my $mode = (stat $file)[2]; 

給出了文件的模式,可謂類型和權限。然後,在chmod的文檔中,建議在將模式從stat發送到chmod時掩蓋文件類型,例如,

my $perm = (stat $file)[2] & 07777; 
chmod($perm | 0600, $file); 

類似地,對於mkdir的文檔表明mkdir(FILENAME,MASK)「創建了由FILENAME指定的目錄中,由MASK指定的權限(由作爲umask的修改)」。

好吧。這是我沒有得到的。在命令行上,我使用默認權限drwxr-xr-x(八進制0755)在我的主目錄中創建目錄臨時文件。然後

  1. Perl的統計告訴我,這個目錄的模式爲16877.
  2. $perms = (stat 'temp')[2] & 07777;返回493
  3. $perms = sprintf("%04o",(stat 'temp')[2] & 07777);收益0755

我預計chmod(x,'temp')與X =(1) (2)將temp/上的權限更改爲棘手的問題。但是,所有三個給予drwxr-xr-x(不可否認,(3)您必須做chmod(oct($perms),'temp);)類似地,mkdir(temp,16877),mkdir(temp,493),mkdir(temp,0755)都給予權限drwxr-xr-xtemp/

所以,我的問題是:究竟發生了什麼? chmod和mkdir如何取得這三個不同的值並在temp/上設置相同的權限?我意識到一個答案可能是「有多種方法可以做到這一點」,儘管如此,但我想了解這裏發生了什麼。另外,將權限值傳遞給這些函數的建議方式是什麼?謝謝!

+0

我無法理解短語「chmod(x,'temp')with x =(1)and(2)」。你能澄清嗎? – msw 2012-02-08 03:54:31

回答

4

493十進制= 0755八進制,所以這是一個非問題 - 它們是相同的。 16877十進制= 40755八進制。 看起來chmod只使用它需要的位並忽略高位中的任何內容。

+1

高於07777的位不會被'chmod'改變,因爲系統以這種方式保護健康。例如,允許程序更改S_IFDIR(04000)可以將常規文件更改爲目錄,反之亦然;那會很糟糕。同樣的,S_IFBLK(060000)只能由'mknod(2)'設置,並且一旦一個塊設備,總是一個塊設備,所以改變這些位是沒有意義的。 – msw 2012-02-08 04:05:20

+0

感謝John3136和msw--澄清:文檔中的'&07777'不是必需的。另外,有沒有mkdir和chmod處理這個參數的情況? – Jason 2012-02-08 04:20:31

+1

&07777只是確保你只傳球12比特的旗幟。無論如何,一個明智的操作系統會忽略07777以上的任何內容,但是執行AND是一種很好的編程習慣。 mkdir使用由當前umask修改的掩碼。 chmod不會使用cuirrent umask,所以行爲可能會有所不同。 – John3136 2012-02-08 04:36:22

2

並非所有文件系統類型都支持所有字段。下面是 的字段的含義:

 
    0 dev  device number of filesystem 
    1 ino  inode number 
    2 mode  file mode (type and permissions) 

(stat $file)[2],根據該文檔,是文件模式,由類型和權限。 16877十進制是40755八進制。額外的40000相當於Fcntl::S_IFDIR,告訴你$file是一個目錄。