umask()函数

现在我们已经描述了文件相关联的九个权限位,我们可以描述每个进程的文件模式创建的屏蔽字(mask)。
umask函数为进程设置 文件模式创建屏蔽字(file mode creation mask)平且返回上次的值。(这个函数时一些不返回错误中的一个).
#include <sys/stat.h>
mode_t umask(mode_t cmask);
 returns:previous file mode creation mask
参数cmask别格式成按位或上图4.6中的任意常量:S_IRUSR,S_IWUSR, 等等。
无论何时进程创建一个文件或是一个新目录the file mode creation mask被使用。(回顾我们在3.3节和3.4节对open和creat函数的描述。它们都接受Mode参数来指定新文件的访问权限位。)我们在4.20节描述如何创建一个新的目录。在文件模式创建屏蔽字为1的位,则文件mode为0。
例如:
在图4.9的程序创建两个文件,一个umask字为0,另一个禁止了所有组合另外的权限位。
如果你运行这个程序,我们将看到如何设置权限位。
  
 $ umask                    first print the current file mode creation mask
       002
       $ ./a.out
       $ ls -l foo bar
       -rw------- 1 sar            0 Dec 7 21:20 bar
       -rw-rw-rw- 1 sar            0 Dec 7 21:20 foo
       $ umask                    see if the file mode creation mask changed
       002
Figure 4.9. Example of umask function
#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 error for foo");
    umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    if (creat("bar", RWRWRW) < 0)
        err_sys("creat error for bar");
    exit(0);
}
大部分unix系统绝不处理umask值。通常在登录时的shell的start-up 文件设置一次,并绝不改变。
然而,当写程序创建新文件的时候,如果我们想保证指定的存取权限位被有效。当程序运行时我们必须改变umask值,例如,如果你想确保任何人都能读文件,我们将设置umask为0。另外,当我们的进程运行时可能导致权限位被置0而影响到umask值。
在前面的例子中,在我们运行程序前后,我们使用shell的umask命令打印文件模式创建屏蔽字。这告诉我们改变进程的文件模式创建屏蔽字并不能影响他父亲的umask(通常是shell).所有的shell都有内置的umask命令可以设置或打印当前的file mode creation mask.
用户可以设置umask值以控制创建文件的默认权限。这个值用八进制表达,一个位代表一个权的屏蔽,如图4.10。权限可以拒绝设置相应的位。普通的Umask值是002允许别人写你的文件,022代表组成员和别人可以写你的文件,027代表组成员可以写你的文件并且别人可以读写并执行你的文件。
Figure 4.10. The umask file access permission bits Mask bit
 Meaning
 
0400 user-read
 
0200 user-write
 
0100 user-execute
 
0040 group-read
 
0020 group-write
 
0010 group-execute
 
0004 other-read
 
0002 other-write
 
0001 other-execute
 
The Single UNIX Specification requires that the shell support a symbolic form of the umask command. Unlike the octal format, the symbolic format specifies which permissions are to be allowed (i.e., clear in the file creation mask) instead of which ones are to be denied (i.e., set in the file creation mask). Compare both forms of the command, shown below.
       $ umask                        first print the current file mode creation mask
       002
       $ umask -S                     print the symbolic form
       u=rwx,g=rwx,o=rx
       $ umask 027                    change the file mode creation mask
       $ umask -S                     print the symbolic form
       u=rwx,g=rx,o=

### C语言中实现 `umask` 函数的方式及代码示例 #### 一、`umask` 函数简介 `umask` 是一个系统调用,用于设置文件模式创建掩码(File Mode Creation Mask),它决定了新创建文件或目录的默认权限。通过调用 `umask`,可以指定哪些权限位被禁用。此函数返回之前的掩码值,并应用新的掩码值[^4]。 #### 二、`umask` 的工作原理 在 Linux 系统中,当创建一个新文件或目录时,默认的最大权限分别为: - 文件:`0666` (即 `-rw-rw-rw-`) - 目录:`0777` (即 `drwxrwxrwx`) 最终的实际权限由以下公式计算得到: \[ \text{实际权限} = \text{最大权限} - \text{umask} \] 例如,如果设置了 `umask 022`,那么新文件的权限将是 \(0666 - 0022 = 0644\) (`-rw-r--r--`),而新目录的权限则为 \(0777 - 0022 = 0755\) (`drwxr-xr-x`) [^4]。 #### 三、C语言中实现 `umask` 的代码示例 以下是使用 C 语言实现 `umask` 功能的一个完整示例: ```c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) int main(void) { mode_t old_mask; // Step 1: 设置 umask 为 0,表示不对文件权限进行任何屏蔽 old_mask = umask(0); printf("Old mask was %o\n", old_mask); // Step 2: 创建第一个文件,权限为 RWRWRW if (creat("umask1.txt", RWRWRW) == -1) { perror("create umask1"); return 1; } // Step 3: 更改 umask,屏蔽组和其他用户的读写权限 umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); // Step 4: 创建第二个文件,观察权限变化 if (creat("umask2.txt", RWRWRW) == -1) { perror("create umask2"); return 1; } return 0; } ``` 在这个例子中: 1. 使用 `umask(0)` 将掩码设为零,意味着不会屏蔽任何权限。 2. 调用 `creat()` 创建名为 `umask1.txt` 的文件,其权限应为 `0666`(因为未受到 `umask` 影响)。 3. 再次调用 `umask` 来屏蔽组和其他用户的读写权限。 4. 继续调用 `creat()` 创建另一个文件 `umask2.txt`,此时由于 `umask` 的影响,该文件的权限会被相应减少[^4]。 --- #### 四、注意事项 1. **返回值的意义** `umask` 返回之前设置的掩码值,因此可以通过保存并恢复旧的掩码值来确保程序行为一致。 2. **权限范围限制** 新文件的权限始终受限于 `umask` 所定义的屏蔽规则,即使尝试赋予更高的权限也无法突破这一约束[^4]。 3. **线程安全性** `umask` 是一个全局性的设置,会影响同一进程中所有后续的文件操作。因此,在多线程环境中需谨慎使用,以免引发不可预期的行为[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值