2011-07-09 25 views

回答

10

要閱讀粘滯位使用stat()檢查.st_modeS_ISVTX

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

struct stat file_stats; 
stat("my_file", &file_stats); 
if (file_stats.st_mode & S_ISVTX) 
    printf("sticky\n"); 

重置它,你做它通過chmod

struct stat file_stats; 
stat("my_file", &file_stats); 
mode_t new_mode = file_stats.st_mode & ~S_ISVTX; 
chmod("my_file", new_mode); 

來設置它,chmod

struct stat file_stats; 
stat("my_file", &file_stats); 
mode_t new_mode = file_stats.st_mode | S_ISVTX; 
chmod("my_file", new_mode); 

th代碼是未經測試的。

手冊頁:stat(2)chmod(2)

+0

嚴格來說,這也嘗試使用'chmod'來設置「文件類型」位,我相信這是不被允許的。另外請注意,這段代碼是活潑的;例如如果你的文件被刪除並在調用'stat()'和調用'chmod()'之間被替換。 (其中一個原因'fstat'和'fchmod'可能更好;另一個是性能......) – Nemo

+0

你確定chmod嘗試設置「文件類型」位,不管它們是什麼?此外,如果您正在檢查在通話之間被刪除的文件,您還應該檢查通話之間的核崩潰。 –

+0

除了權限之外,struct stat的st_mode字段還包括「文件類型」位(常規文件與目錄與套接字等)。而且你不能用'chmod'來設置它們,所以如果你嘗試的話可能會出錯。如果你不認爲值得擔心在Unix上涉及文件創建/刪除的競爭條件,我有一些CERT建議會告訴你...... – Nemo

1

這是位01000(八進制),這樣你就可以chmod(dir, 01000 | perms)設置。我敢肯定,如果你打開頭文件,也許stat.h,你會發現這個位的正確名稱。

+1

看一看統計(2) - 例如http://linux.die.net/man/2/stat的名字是'S_ISVTX' –

+0

@mru:事實上,它也是[POSIX標準]的一部分(http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_stat.h.html)。 – Nemo

+1

@jcomeau:提問者也問到如何「檢查」這個位,所以你可能還想提及'stat'或'fstat'。 – Nemo