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