umask() 系统调用如何屏蔽权限

umask() 系统调用如何屏蔽权限

我正在使用umask()系统调用来设置文件权限。我正在使用以下代码:

umask(S_IWGRP | S_IWOTH);
printf("Enter file name that you want to create:");
scanf(" %s",file);
fd = open(file,O_CREAT|O_WRONLY);

但执行后,将使用以下给定的权限创建文件

--wS-----T 1 rvi rvi     0 Oct  2 15:20 test.txt

S这一点点是T干什么用的?为什么它会自动修改?

答案1

当您使用 O_CREAT 调用 open 时,它需要第三个参数来表示文件的模式。然后,umask 将从您请求的模式中屏蔽掉。因此,例如:

umask(S_IWGRP | S_IWOTH /* == 0022 */);
fd = open(file, O_CREAT|O_WRONLY, 0777);

将创建一个带有标志 0777 & (~0022) = 0755 的文件,即 rwxr-xr-x,而:

umask(S_IWGRP | S_IWOTH);
fd = open(file, O_CREAT|O_WRONLY, 0666);

将创建一个带有标志 0666 & (~0022) = 0644 的文件,即 rw-r--r--。在您的情况下,因为您没有提供模式参数,所以 open 函数会从堆栈中取出随机数据,因此您唯一知道的是用 umask 屏蔽的位将被关闭。尝试向公开呼叫提供您所需的模式; 0777 是可执行文件的不错选择,0666 是非可执行文件的不错选择。

相关内容