1. 程式人生 > >Linux下的umask函式

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