chmod函式中的mode t引數

2021-05-24 14:49:47 字數 1492 閱讀 6614

chmod函式的定義:

#include

#include

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)。

linux中open 函式的mode t 含義

開啟檔案 新建檔案和關閉檔案操作 開啟檔案操作使用系統呼叫函式open 該函式的作用是建立乙個檔案描述符,其他的函式可以通過檔案描述符對指定檔案進行讀取與寫入的操作。開啟檔案的一般形式是 open 檔案路徑,標誌 函式的返回值是檔案描述符,如果開啟檔案成功返回乙個正整數,否則返回 1。標誌是用於指定...

chmod函式的使用

chmod函式改變目錄或者檔案的許可權 1 s isuid 04000 檔案的 set user id on execution 位 2 s isgid 02000 檔案的 set group id on execution 位 3 s isvtx 01000 檔案的sticky 位 4 s iru...

函式形參中的const引用

這裡將c primer中函式形參章節有關const和引用的問題簡單小結如下 一 非const非引用形參 這個是乙個平庸的情形。函式引數通過複製對應的實參實現初始化,函式本身對形參的修改不會影響到實參。傳遞給這類函式的實參可以是乙個const型的物件,也可以是非const的物件。乙個需要注意的事情是,...