本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。
umask函數為進程設置文件模式創建屏蔽字,并返回以前的值。(這是少數幾個沒有出錯返回函數中的一個。)
#include <sys/stat.h>mode_t umask( mode_t cmask);
返回值:以前的文件模式創建屏蔽字
其中,參數cmask是由S_IRUSR、S_IWUSR、S_IXUSR、S_IRGRP、S_IWGRP、S_IXG、S_IROTH、S_IWOTH及S_IXOTH這9個常量中的若干個按位“或”構成的。
在進程創建一個新文件或新目錄時,就一定會使用文件模式創建屏蔽字。對于任何在文件模式創建屏蔽字中為1的位,在文件mode中的相應位則一定被關閉。
程序清單4-3 umash函數實例
[root@localhost apue]# cat PRog4-3.c#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("creat errro for foo"); umask(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if(creat("bar", RWRWRW) < 0) err_sys("creat error for bar"); exit(0);}
若運行此程序可以得到如下結果,從中可見訪問權限是如何設置的。
[root@localhost apue]# ./prog4-3[root@localhost apue]# ls -l foo bar-rw------- 1 root root 0 01-02 02:00 bar-rw-rw-rw- 1 root root 0 01-02 02:00 foo
更改進程的文件模式創建屏蔽字并不影響其父進程(常常是shell)的屏蔽字。
所有shell都有內置umask命令,我們可以用該命令設置或打印當前文件模式創建屏蔽字。
用戶可以設置umask值以控制他們所創建文件的默認權限。該值表示成八進制數,一位代表一種要屏蔽的權限(讀-4、寫-2、執行-1,可相加如6-讀寫)。設置了相應位后,它所對應的權限就會被拒絕。常用的幾種umask值是002、022、和027,002阻止其他用戶寫你的文件,022阻止同組成員和其他用戶寫你的文件,027阻止同組成員寫你的文件以及其他用戶讀、寫或執行你的文件。
Single UNIX Specification要求shell支持符號形式的umask命令。與八進制格式不同,符號格式指定許可的權限(即在文件創建屏蔽字中為0的位)而非拒絕的權限(即在文件創建屏蔽字中為1的位)。下面比較了兩種格式的命令:
[root@localhost apue]# umask0022[root@localhost apue]# umask -Su=rwx,g=rx,o=rx
新聞熱點
疑難解答