chmod函數中的mode_t參數

chmod函數的定義: 
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path, mode_t mode)

關於mode_t的定義:
#ifndef __mode_t_defined
typedef __mode_t mode_t;
# define __mode_t_defined
#endif


__mode_t的定義:

#define __mode_t __MODE_T_TYPE
#define __MODE_T_TYPE __U32_TYPE
#define __U32_TYPE unsigned int


可以看到mode_t的定義實際就是unsigned int形式的。

   但是函數chmod(const char *path, mode_t mode)在解釋mode_t時是將這裏的mode當成8進制的去解釋。

參數 mode 有下列數種組合
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-id on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR(S_IREAD) 00400 文件所有者具可讀取權限
S_IWUSR(S_IWRITE)00200 文件所有者具可寫入權限 
S_IXUSR(S_IEXEC) 00100 文件所有者具可執行權限
S_IRGRP 00040 用戶組具可讀取權限
S_IWGRP 00020 用戶組具可寫入權限
S_IXGRP 00010 用戶組具可執行權限
S_IROTH 00004 其他用戶具可讀取權限
S_IWOTH 00002 其他用戶具可寫入權限
S_IXOTH 00001 其他用戶具可執行權限

比如要將文件test的權限修改爲644,那麼可以採用以下幾種方法:
chmod("test", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
chmod("test", 0644);
chmod("test", 420);

   第一種方法是將00400和00200和00040和00004進行或運算,最終得到的結果就是0644(八進制),而八進制的0644就等於十進制的420。所以上面三種方法是等效的。
   當我們給chmod函數傳遞參數時他會將對應的十進制的mode參數轉換爲相應的八進制進行運算。所以我們要將test文件的權限改爲644時傳遞給函數chmod的參數不能直接是644。而應該是420。這是因爲十進制的420就等於八進制的644。

   但是我們使用chmod命令時卻可以直接輸入644。具體的chmod實現時我認爲是將644接收後(接收時可能是以字符串形式接收)認爲644是八進制的數據,然後將644轉換爲對應的十進制,然後直接傳遞給函數chmod(const char *path, mode_t mode)。

原文請參考:http://blog.chinaunix.net/space.php?uid=20753645&do=blog&id=1877868

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章