Linux下的umask函式
umask函式為程序設定檔案模式建立遮蔽字,並返回以前的值。函式原型為:
#include <sys/stat.h>
mode_t umask(mode_t cmask);
cmask是由下表列出的9個常量中的若干個按位“或”構成的
S_IRUSR 使用者讀
S_IWUSR 使用者寫
S_IXUSR 使用者執行
S_IRGRP 組讀
S_IWGRP 組寫
S_IXGRP 組執行
S_IROTH 其他讀
S_IWOTH 其他寫
S_IXOTH 其他執行
在Linux中一個檔案的許可權分為3組9個許可權 分別為上面列出的9個,組間的順序為使用者,組,其他。例如:
ls -l test
-rw-rw-rw- 1 shmily shmily 0 5月 6 17:16 test
表示test檔案的許可權為:使用者可讀可寫,組可讀可寫,其他可讀可寫 (r代表可讀 w代表可寫 x代表可執行 -代表未設定)
可用三位8進位制數表示 則test的許可權為666
————————————————————————————————————————————————————————————————————————————
umask的主要作用是在建立檔案時設定或者遮蔽掉檔案的一些許可權
在建立一個檔案時要指明該檔案的許可權,open函式的最後一個引數mode並不是要設定的許可權,它需要執行以下操作
mode & (~cmask)
例如《APUE》中的4_3的函式
#include "apue.h" #include <fcntl.h> #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) int main(void) { umask(0); if (creat("foo", RWRWRW) < 0) err_sys("create error for foo"); umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if (creat("bar", RWRWRW) < 0) err_sys("creat error for bar"); return 0; }
在最初cmask為0,即 000 000 000
creat函式時設定mode為666
mode & (~cmask) = 110 110 110 & 111 111 111 = 110 110 110
所以foo檔案的許可權就是rw-rw-rw-
然後cmask為066,即000 110 110
crear函式的mode仍為666
mode & (~cmask) = 110 110 110 & 111 001 001 = 110 000 000
所以bar檔案的許可權為rw-------
[email protected]:~/code/UnixCode$ ls -l foo bar
-rw------- 1 shmily shmily 0 5月 6 17:16 bar
-rw-rw-rw- 1 shmily shmily 0 5月 6 17:16 foo